Python Django单元测试-AssertRaiss在不应该的时候工作';T

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

我在对一个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会导致异常,在
客户机.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(…)
,看起来这并没有引发预期的异常。这表明你的修补程序不起作用。