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