Django单元测试 - assertRaises不应该工作

时间:2016-05-31 10:21:56

标签: python django python-2.7 unit-testing

我是代码审查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)

1 个答案:

答案 0 :(得分:2)

您应该将可调用对象传递给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会提升assertRaises。因为您使用Exception呼叫ValueError,所以测试通过了。建议您使用更具体的错误(例如Exception)而非 x = True self.assertRaises(ValueError, x) ,以避免此类问题。例如,

x

会失败,因为调用TypeError会引发Table