28

In the pytest documentation it says that you can customize the output message when an assert fails. I want to customize the assert message when testing a REST API method it returns an invalid status code:

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

So I tried to put a piece of code like this in conftest.py

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

But the problem is left is the actual value of response.status_code so it's an int instead of a Response. However the default output messages throws something like:

E assert 400 == 201 E + where 400 = .status_code

Saying that the error 400 comes from an attribute status_code of a object Response.

My point is that there is a kind of introspection of the variable being evaluated. So, how can I customize the assert error message in a comfortable way to get a similar output to example posted above?

Ali
  • 3,373
  • 5
  • 42
  • 54
Marc Tudurí
  • 1,869
  • 3
  • 18
  • 22

1 Answers1

41

you could use Python built-in capability to show custom exception message:

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

Or you can built a helper assert functions:

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)

also checkout: https://wiki.python.org/moin/UsingAssertionsEffectively

Dmitry Tokarev
  • 1,851
  • 15
  • 29