【问题标题】:Django/Python assertRaises with message check带有消息检查的 Django/Python assertRaises
【发布时间】:2014-12-27 03:36:19
【问题描述】:

我对 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"))

【问题讨论】:

    标签: python django validation unit-testing


    【解决方案1】:

    你可以使用assertRaisesRegexp

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

    当您将它用作上下文管理器时,第二个参数是一个正则表达式,用于搜索异常的字符串表示。

    【讨论】:

      【解决方案2】:

      现在您可以将assertRaises 用作a context manager。这样您就可以捕获异常并在以后检查它。

      with self.assertRaises(SomeException) as cm:
          do_something()
      
      the_exception = cm.exception
      self.assertEqual(the_exception.error_code, 3)
      

      【讨论】:

      • 这给了我以下错误:'_AssertRaisesContext' 对象没有属性'message'
      • 我刚刚测试过,它可以与CPython 3.6.4一起正常工作
      • 如果你想测试消息,你可以这样做:self.assertEqual('{}'.format(cm.exception), 'I expected this message')
      【解决方案3】:

      由于该问题与 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 查找:假设您的异常引发“我的自定义消息!”,断言 “自定义消息” 通过。请牢记这一点,尤其是当您有多个(自定义)异常和类似消息时。

      (例如,两个不同的异常引发 “我的自定义消息!更多详细信息...”“我的自定义消息!没有详细信息。” 都会传递一个断言“我的自定义消息!”)。

      【讨论】:

        猜你喜欢
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        • 2013-12-19
        • 2013-07-09
        • 1970-01-01
        相关资源
        最近更新 更多