2014-10-30 71 views
20

我对Python比较新,想用assertRaises测试来检查ValidationError,它工作正常。但是,我有很多ValidationError,我想确保正确的返回。我想我可以通过assertRaises的东西,但它看起来不像我可以,所以我想我会做一个assertTrue并检查异常消息。但是,我不知道如何访问它。这是解决这个问题的好方法吗?谢谢。Django/Python assertRaises with message check

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

回答

23

您可以使用assertRaisesRegexp

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

当你使用它作为一个上下文管理器的第二个参数是正则表达式通过异常的字符串表示进行搜索。

+0

很好的答案,谢谢。 :) – Teekin 2018-01-01 23:44:43

3

现在您可以使用assertRaises作为a context manager。这样您可以捕获异常并稍后检查。

with self.assertRaises(SomeException) as cm: 
    do_something() 

the_exception = cm.exception 
self.assertEqual(the_exception.error_code, 3) 
+3

这给了我以下错误:'_AssertRaisesContext'对象没有属性'消息' – ems 2016-06-16 22:16:01

4

因为问题是有关Django的,你也可以使用assertRaisesMessage情况管理器从Django的TestCase的继承时。

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经理做的例外消息的 '在' 查找。所以如果你的异常提出“我的自定义信息!”你甚至可以断言“自定义消息”。记住这一点,以防万一你定义了多个异常返回类似的消息(例如,上述测试也会传递一条消息,如“我的自定义消息!这里有一些进一步的细节。”这可能不是理想的结果) 。