私はPythonに比較的慣れていないため、assertRaises
テストを使用してValidationError
をチェックします。これは問題なく動作します。しかし、多くのValidationError
sと正しいものが返されることを確認したいのですが、何かをassertRaises
に渡すことができると思ったのですが、それができるようには見えないので、assertTrue
と例外メッセージを確認します。ただし、アクセス方法がわかりません。これは、この問題に対処するための良い方法ですか?感謝します。
class DailyEntriesTests(TestCase):
def test_cant_have_ip_and_user(self):
u = createUser(False)
de = createDailyEntry(u, "1.1.1.1", 1)
with self.assertRaises(ValidationError) as cm:
de.full_clean()
# this line bombs - message doesn't exist. I also tried "error_code" like I saw in the documentation, but that doesn't work
print(cm.exception.message)
self.assertTrue(cm.exception.message.contains("Both"))
assertRaisesRegexp
を使用できます。
with self.assertRaisesRegexp(ValidationError, "Both"):
de.full_clean()
コンテキストマネージャとして使用する場合、2番目の引数は、例外の文字列表現を検索するための正規表現です。
現在、assertRaises
を コンテキストマネージャ として使用できます。この方法で、例外をキャプチャして後で検査できます。
with self.assertRaises(SomeException) as cm:
do_something()
the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
質問はDjangoに関連しているため、DjangoのTestCaseから継承するときにassertRaisesMessage
コンテキストマネージャを使用することもできます。
from Django.test import TestCase
class ExceptionTest(TestCase):
def test_call_raises_exception_with_custom_message(self):
with self.assertRaisesMessage(Exception, 'My custom message!'):
call_that_causes_exception()
注:assertRaisesMessage
マネージャは、例外メッセージに対して「in」ルックアップを実行します。したがって、例外が "My custom message!"を発生させた場合、 "custom message"をアサートすることもできます。同様のメッセージを返す複数の例外を定義した場合に注意してください(たとえば、上記のテストは "My custom message!And like more details。"これは望ましい結果ではない可能性があります)。