2014-10-30 64 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經理做的例外消息的 '在' 查找。所以如果你的異常提出「我的自定義信息!」你甚至可以斷言「自定義消息」。記住這一點,以防萬一你定義了多個異常返回類似的消息(例如,上述測試也會傳遞一條消息,如「我的自定義消息!這裏有一些進一步的細節。」這可能不是理想的結果) 。

相關問題