2

所以我正在学习如何在 Django 中练习 TDD,但遇到了一些小麻烦。我创建了一个自定义用户对象,它以一对一的关系链接到经过身份验证的系统用户。我有以下测试,它练习了我的自定义用户类的一部分:

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

默认错误消息显示失败的值。但是您通过提供第三个参数来覆盖它assertEqual。如果您忽略它,它将打印这些值。

longMessage正如 Gonzalo 所展示的,您实际上可以通过使用属性获得两全其美的效果。

于 2012-11-03T17:40:52.160 回答