簡體   English   中英

Django單元測試-assertRaises在不應該進行的時候工作

[英]Django unit testing - assertRaises working when it shouldn't

我正在查看API的代碼,並在單元測試中發現了這一點。 測試通過了,但我不明白為什么。

class SomeTestCase(TestCase):

    def setUp(self):
        self.client = Client()

    @mock.patch("patch.a.thing", mock_function)
    def test_fail(self):
        request_data = {
            "some": "bad data"
        }

        response = self.client.post(
            "/path/to/api",
            json.dumps(request_data),
            content_type="application/json",
            HTTP_HEADERNAME=HEADER_VALUE
        )

        self.assertRaises(Exception, response)

在傳遞錯誤數據時,我們期望API提供500個狀態代碼。 即使調用該API會引起異常,在client.post外殼測試期間是否也不會引發異常? response不是可調用的,因此將其傳遞給assertRaises是錯誤的,但是我希望看到的行為是assertRaises沒有得到異常,因此單元測試失敗。 誰能解釋為什么會這樣?

編輯:

我剛剛對此進行了測試,並且該單元測試也通過了:

class ThingTestCase(TestCase):

    def test_thing_fails(self):
        x = True
        y = False
        z = {"some": "thing"}

        self.assertRaises(Exception, x)
        self.assertRaises(Exception, y)
        self.assertRaises(Exception, z)
        self.assertRaises(Exception)

您應該將一個callable傳遞給assertRaises

self.assertRaises(Exception, self.client.post,
        "/path/to/api",
        json.dumps(request_data),
        content_type="application/json",
        HTTP_HEADERNAME=HEADER_VALUE
)

將其用作上下文管理器可能更清晰:

with self.assertRaises(Exception)
    response = self.client.post(
        "/path/to/api",
        json.dumps(request_data),
        content_type="application/json",
        HTTP_HEADERNAME=HEADER_VALUE
    )

此刻, self.assertRaises(Exception, response)將嘗試調用response ,這將引發TypeError因為它不可調用。 因為您使用Exception調用assertRaises ,所以測試通過了。 建議使用更具體的錯誤(例如ValueError )而不是Exception ,以避免出現此類問題。 例如,

    x = True
    self.assertRaises(ValueError, x)

將失敗,因為調用x會引發TypeError

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM