1. ホーム
  2. django

どのように失敗することを意味するdjangoのテストを書くか?

2023-09-21 02:13:09

質問

というモデルを持っています。 Thing という属性があり name という属性があり、name は char フィールドで のみ 3文字の長さです。

どのようにテストを書けばいいのでしょうか?

class TestCase1(TestCase):
    def test1(self):
        thing = Thing(name='1234')

というテストは失敗するはずです。どのようにテストを正しく書けば、テストが を通過します。 を通過させるためには、どのようにテストを書けばよいのでしょうか?

どのように解決するのですか?

Thing(name='1234')が例外を発生させることを期待している場合、2つの対処方法があります。

一つは Django の assertRaises (実際には unittest/unittest2 のもの) を使うことです。

def mytest(self):
    self.assertRaises(FooException, Thing, name='1234')

これはThing(name='1234')がFooExceptionエラーを発生させない限り失敗します。 もう一つの方法は、このように期待される例外をキャッチし、それが起こらなかった場合に例外を発生させることです。

def mytest(self):
    try:
        thing = Thing(name='1234')
        self.fail("your message here")
    except FooException:
        pass

明らかに、FooExceptionを、長すぎる文字列でオブジェクトを作成することで得られると予想されるものに置き換えてください。 ValidationErrorでしょうか?

3つ目の選択肢(Python 2.7時点)は、コンテキストマネージャとしてassertRaisesを使用することで、よりクリーンで読みやすいコードになります。

def mytest(self):
    with self.assertRaises(FooException):
        thing = Thing(name='1234')

悲しいことに、これではテストの失敗メッセージをカスタマイズすることができないので、テストをきちんと文書化しましょう。 参照 https://hg.python.org/cpython/file/2.7/Lib/unittest/case.py#l97 を参照してください。