pytestドキュメント では、assert
が失敗したときに出力メッセージをカスタマイズできると書かれています。 REST APIメソッドをテストするときにassert
メッセージをカスタマイズしたいのですが、無効なステータスコードが返されます:
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アサート400 == 201 E +ここで、400 = .status_code
エラー400は、オブジェクトResponse
の属性status_code
に起因すると言います。
私のポイントは、評価されている変数の一種の内省があるということです。では、上記の例と同様の出力を取得するために、快適な方法でアサートエラーメッセージをカスタマイズするにはどうすればよいですか?
Python組み込み機能を使用して、カスタム例外メッセージを表示できます。
assert response.status_code == 200, "My custom msg: actual status code {}".format(response.status_code)
または、ヘルパーアサート関数を作成できます。
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