Python Django单元测试-AssertRaiss在不应该的时候工作';T
我在对一个API进行代码审查时,在单元测试中发现了这一点。考试通过了,但我不明白为什么Python Django单元测试-AssertRaiss在不应该的时候工作';T,python,django,python-2.7,unit-testing,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
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会导致异常,在客户机.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)
您应该将可调用的消息传递给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
,因此测试通过。建议使用更具体的错误(例如ValueError
),而不是Exception
,以避免此类问题。比如说,
x = True
self.assertRaises(ValueError, x)
将失败,因为调用x
会引发TypeError
您应该将可调用的
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
,因此测试通过。建议使用更具体的错误(例如ValueError
),而不是Exception
,以避免此类问题。比如说,
x = True
self.assertRaises(ValueError, x)
将失败,因为调用x
会引发TypeError
,因为您在断言之前调用response=self.client.post(…)
,这似乎不会引发预期的异常。这表明你的monkeypatching不起作用。因为你在断言之前调用了response=self.client.post(…)
,看起来这并没有引发预期的异常。这表明你的修补程序不起作用。