2

だから私は Django で TDD を練習する方法を学んでいますが、ちょっとした問題があります。認証されたシステム ユーザーに 1 対 1 の関係でリンクするカスタム ユーザー オブジェクトを作成しました。カスタム ユーザー クラスの一部を実行する次のテストがあります。

def test_creating_a_user_with_attributes(self):
    myuser = Myuser.objects.create_user('Gary', email='me@email.com')
    current_time = now()
    myuser.birthday = current_time
    myuser.save()
    first_user = Myuser.objects.all()[0]
    self.assertEqual(first_user.birthday, current_time, 'first_user.birthday should be equal to the current_time')

問題は、テストが失敗し、その理由がすぐにわからなかったことです。アサートの失敗は、私が提供したメッセージを報告し、誕生日が今の値に設定されていると確信していたので混乱しました。失敗した値を明確にするために、アサートをリファクタリングする必要がありました。

    self.assertEqual(first_user.birthday, current_time,
        'first_user.birthday ' + str(first_user.birthday) + ' should equal ' + str(current_time))

これにより、誕生日が日時フィールドではなく日付フィールドであることが明らかになりました。私の質問は、失敗メッセージの一部として期待値と実際の値をダンプする代替形式のアサートが存在するかどうか、または API を何らかの形で誤用または誤解している場合です。

4

2 に答える 2

5

Django は assertEqual を実装しておらず、単に Python の unittest モジュールを使用しています。

必要なのは、テスト ケース クラスのlongMessage属性を次のように設定することです。True

class VerboseTestCase(TestCase):
    longMessage = True

    def test_creating_a_user_with_attributes(self):
        myuser = Myuser.objects.create_user('Gary', email='me@email.com')
        current_time = now()
        myuser.birthday = current_time
        myuser.save()
        first_user = Myuser.objects.all()[0]
        self.assertEqual(first_user.birthday, current_time, 'first_user.birthday should be equal to the current_time')

テストが失敗した場合、次のようなものが出力されます。

AssertionError: <datetime 1> != <datetime 2> : first_user.birthday should be equal to the current_time

これはPython の unittest docsで説明されています。

于 2012-11-03T17:37:12.917 に答える
2

デフォルトのエラー メッセージには、失敗した値が表示されます。しかし、 に 3 番目の引数を指定することでそれをオーバーライドしましたassertEqual。それを省略すると、値が出力されます。

Gonzalo が示しているように、longMessage属性を使用することで、実際に両方の長所を活かすことができます。

于 2012-11-03T17:40:52.160 に答える