代码之家  ›  专栏  ›  技术社区  ›  Alexander Bird

如何编写注定要失败的django测试?

  •  43
  • Alexander Bird  · 技术社区  · 14 年前

    我有个模特叫 Thing 具有一个名为 name ,我希望name是一个char字段 只有 3个字符长。

    我该怎么写一个测试呢?

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

    那次测试应该失败。如何正确编写测试以便 通行证 当那个物体失败时?

    3 回复  |  直到 14 年前
        1
  •  93
  •   GDorn    9 年前

    如果您希望Thing(name='1234')引发异常,有两种方法可以处理此问题。

    一种是使用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替换为您希望从创建具有太长字符串的对象中获得的FooException。验证错误?

    第三个选项(从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 更多细节。

        2
  •  4
  •   Chris    6 年前

    我正在使用 expectedFailure 装饰工 unittest . 这就像广告中说的那样:没有错误时失败,有失败时通过。

    我用 预期故障 以验证我的自定义断言例程是否实际工作,而不仅仅是简单地检查一切正常。

    import unittest
    from django.test import TestCase
    
    class EmojiTestCase(TestCase):
    
        @unittest.expectedFailure
        def testCustomAssert(self):
            self.assertHappyFace(':(') # must fail.
    

    但在测试过程中会打印一条警告信息。我把它和姜戈和鼻子一起用。哪个 others 也看到了。

    /usr/lib64/python3.4/unittest/case.py:525:运行时警告:TestResult没有addExpectedFailure方法,报告为passes 运行时警告)

    我来这里是想找到更好的解决办法,但没有找到。所以我至少想告诉别人我一直在做的事情。

        3
  •  -3
  •   Tomasz Zieliński    14 年前

    这样的做法应该管用:

    thing = Thing.objects.create(name='1234')  
    # not sure if you need here .get() or if. create() truncates the field on its own
    self.assertEqual(thing.name, '123') # or: self.assertEqual(len(thing.name), 3)
    

    --但这样的测试看起来很奇怪:-)

    另外,请注意MySQLdb backend将引发警告异常,以通知您截断字符串,因此您可能希望使用 assertRaises .