web-dev-qa-db-ja.com

Django / Python assertRaisesとメッセージチェック

私はPythonに比較的慣れていないため、assertRaisesテストを使用してValidationErrorをチェックします。これは問題なく動作します。しかし、多くのValidationErrorsと正しいものが返されることを確認したいのですが、何かを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"))
27
skaz

assertRaisesRegexp を使用できます。

with self.assertRaisesRegexp(ValidationError, "Both"):
    de.full_clean()

コンテキストマネージャとして使用する場合、2番目の引数は、例外の文字列表現を検索するための正規表現です。

33
Louis

現在、assertRaisesコンテキストマネージャ として使用できます。この方法で、例外をキャプチャして後で検査できます。

with self.assertRaises(SomeException) as cm:
    do_something()

the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)
9
Christian Long

質問は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。"これは望ましい結果ではない可能性があります)。

8
Kim