web-dev-qa-db-ja.com

Python / Django:ユニットテストの結果に特定の文字列が含まれていることをアサートする方法は?

python単体テスト(実際にはDjango)では、テスト結果に選択した文字列が含まれているかどうかを示す正しいassertステートメントは何ですか?]

self.assertContainsTheString(result, {"car" : ["toyota","honda"]})

私のresultに少なくとも上記の2番目の引数として指定したjsonオブジェクト(または文字列)が含まれていることを確認したい

{"car" : ["toyota","honda"]}
52
user798719
self.assertContains(result, "abcd")

Jsonで動作するように変更できます。

self.assertContainsHttpResponseオブジェクトにのみ使用してください。他のオブジェクトの場合は、self.assertInを使用します。

46
Akshar Raaj

文字列が別の部分文字列であるかどうかをアサートするには、assertInおよびassertNotInを使用する必要があります。

# Passes
self.assertIn('bcd', 'abcde')

# AssertionError: 'bcd' unexpectedly found in 'abcde'
self.assertNotIn('bcd', 'abcde')

これらは Python 2.7 および Python 3.1 以降の新機能です

92
Ed I

単純なassertTrue + in python keyword:

self.assertTrue("expected_part_of_string" in my_longer_string)
18

json.dumps()を使用してJSONオブジェクトを作成します。

次に、assertEqual(result, your_json_dict)を使用してそれらを比較します

import json

expected_dict = {"car":["toyota", "honda"]}
expected_dict_json = json.dumps(expected_dict)

self.assertEqual(result, expected_dict_json)
8

Ed Iが述べたようにassertInはおそらく、ある文字列を別の文字列から見つける最も簡単な答えです。ただし、質問の状態は次のとおりです。

resultには、少なくとも上記の2番目の引数として指定したjsonオブジェクト(または文字列)、つまり{"car" : ["toyota","honda"]}が含まれていることを確認したい

したがって、失敗時に有用なメッセージを受け取るために複数のアサーションを使用します。テストは将来、潜在的に元々書いていない人が理解し、維持する必要があります。したがって、Django.test.TestCaseの中にいると仮定します。

# Check that `car` is a key in `result`
self.assertIn('car', result)
# Compare the `car` to what's expected (assuming that order matters)
self.assertEqual(result['car'], ['toyota', 'honda'])

次のような役立つメッセージが表示されます。

# If 'car' isn't in the result:
AssertionError: 'car' not found in {'context': ..., 'etc':... }
# If 'car' entry doesn't match:
AssertionError: Lists differ: ['toyota', 'honda'] != ['honda', 'volvo']

First differing element 0:
toyota
honda

- ['toyota', 'honda']
+ ['honda', 'volvo']
5
jamesc