22

pytest 文档中,它说您可以在assert失败时自定义输出消息。我想assert在测试返回无效状态代码的 REST API 方法时自定义消息:

def test_api_call(self, client):
    response = client.get(reverse('api:my_api_call'))
    assert response.status_code == 200

所以我试着把这样的一段代码放进去conftest.py

def pytest_assertrepr_compare(op, left, right):
    if isinstance(left, rest_framework.response.Response):
        return left.json()

但问题是left实际值,response.status_code所以它是 aint而不是 a Response。但是,默认输出消息会抛出类似:

E 断言 400 == 201 E + 其中 400 = .status_code

说错误 400 来自status_code对象的属性Response

我的观点是对被评估的变量有一种内省。那么,如何以舒适的方式自定义断言错误消息以获得与上面发布的示例类似的输出?

4

1 回答 1

26

您可以使用 Python 内置功能来显示自定义异常消息:

assert response.status_code == 200, f"My custom msg: actual status code {response.status_code}"

或者您可以构建一个辅助断言函数:

def assert_status(response, status=200):  # you can assert other status codes too
    assert response.status_code == status, \
        f"Expected {status}. Actual status {response.status_code}. Response text {response.text}"

# here is how you'd use it
def test_api_call(self, client):
    response = client.get(reverse('api:my_api_call'))
    assert_status(response)

也结帐:https ://wiki.python.org/moin/UsingAssertionsEffectively

于 2017-06-14T04:47:54.423 回答