Настройка сообщения astest с помощью интроспекции переменных

В документации 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 так что это int вместо Response, Однако выходные сообщения по умолчанию выбрасывают что-то вроде:

E assert 400 == 201 E +, где 400 = .status_code

Сказать, что ошибка 400 происходит от атрибута status_code объекта Response,

Я хочу сказать, что существует некоторая интроспекция оцениваемой переменной. Итак, как мне удобно настроить сообщение об ошибке assert, чтобы получить вывод, аналогичный приведенному выше примеру?

1 ответ

Вы можете использовать встроенную возможность Python для отображения настраиваемого сообщения об исключении:

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

Или вы можете встроить вспомогательные функции assert:

def assert_status(response, status=200):  # you can assert other status codes too
    assert response.status_code == status, \
        "Expected {} actual status {}. Response text {}".format(status, response.status_code, 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

Другие вопросы по тегам