【问题标题】:Django unit testing - assertRaises working when it shouldn'tDjango 单元测试——assertRaises 在不应该的时候工作
【发布时间】:2016-05-31 10:21:56
【问题描述】:

我正在对 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)

【问题讨论】:

  • 由于您在断言之前调用response = self.client.post(...),看起来这并没有引发预期的异常。这表明您的猴子补丁不起作用。

标签: python django python-2.7 unit-testing


【解决方案1】:

您应该将一个可调用对象传递给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

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多