2013-07-08 14 views
25

Python単体テスト(実際にDjango)では、私のテスト結果に自分の選択した文字列が含まれているかどうかを教えてくれる正しいassertの文は何ですか?Python/Django:ユニットテスト結果に特定の文字列が含まれていることをどのようにアサートするのですか?

つまり、私は私のresultが、少なくとも私はつまり、上述の第2引数として指定されたJSONオブジェクト(または文字列)、{"car" : ["toyota","honda"]}

+0

だろう[https://docs.djangoproject.com/en/1.11/topics/testing/tools /#django.test.Response.json] help? – coya

答えて

16
self.assertContains(result, "abcd") 

を使用してそれらを比較します。

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

+2

はい、しかしjson構造のために、それはいくつかの空白を追加することができますが、これはjsonでは問題ではありませんが、Python文字列と比較したい場合は問題ありません。 – francois

+20

assertContainsは、HttpReponse以外のオブジェクトに使われることを意図しておらず、代わりに "in" pythonキーワードでassertTrueを使用することをお勧めします。 – Pcriulan

+9

これは間違っています。 Assertconainsはhttp応答用です。 – kagronick

6

は、JSONのビルドが含まれていることを確認するにself.assertContainsTheString(result, {"car" : ["toyota","honda"]})

のようなものオブジェクトは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) 
+1

['assertEqual()']の代わりに 'assertTrue()'を使う理由(http://docs.python.org/3/library/unittest.html#unittest.TestCase.assertEqual)?少なくとも 'assertEqual()'では、モジュールは結果と期待値の両方を出力します。 –

+0

あなたは正しいです、assertEqual()が良いです。私はリンクを見つけることができませんが、私はassertEqualの代わりにassertTrueを使用するためにどこかを読んでいると確信していました。明らかに、私は間違っていた:)私は上記の例を修正します。 –

+8

'dumps()'は任意の順序を使用しており、 'result'のキーの順序を知らないので、複数のキーを辞書に置いていると、これは信頼できないことに注意してください。あなたは 'self.assertEqual(json.loads(result)、expected_dict)'を使うほうがはるかに良いでしょう。 –

13

あなたはシンプルいるassertTrueで+ Pythonのキーワードに別の文字列内の文字列の予想される部分についてのアサーションを記述することができます。

self.assertTrue("expected_part_of_string" in my_longer_string) 
+4

この戦略の問題は、 "AssertionError:False is not true"という形式の貧弱なエラーメッセージを与えることです。 – jamesc

-1

を私は同様の問題に自分自身を発見し、私は属性rendered_contentを使用し、私は

を書きました

assertTrue('string' in response.rendered_content)と同様

assertFalse('string' in response.rendered_content)私は、文字列が描画されていないことをテストする場合

AssertContains(response, 'html string as rendered')

しかし、それはまた、早期に提案された方法を働いていたが、だから私は最初のものはより簡単であることを言うと思います。 私はそれが助けてくれることを願っています。文字列があるか、別の部分文字列でない場合、あなたはassertInassertNotInを使用する必要があります主張する

57

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

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

Python 2.7Python 3.1

+2

また、assertInは、説明されています。 – jamesc

3

As mentioned by Ed IassertInはおそらく最も簡単であるため、これらが新しいですある文字列を別の文字列で見つけることに答えます。しかし、質問の状態: - テストは、将来的に理解し、維持しなければならない潜在的に元々それらを書いていない誰かによって、役立つメッセージが失敗した場合に受信されるように

I want to make sure that my result contains at least the json object (or string) that I specified as the second argument above,i.e., {"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'] 
関連する問題