34

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?

0

2 Answers 2

56

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

Sign up to request clarification or add additional context in comments.

3 Comments

Thanks Dmitry. I know the both solutions that you propose and sure that both will work. However I was looking for a fancy solution where you can still use assert and you won't need to write more code.
ahh, sorry, didn't get your question intent
The first example in the above response is exactly what I was looking for!
1

Improving @Dmitry answer, you also can return tuple of variables using something like this:

assert response.status_code == 200, (response.status_code, response.json())

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.