2013-07-08 52 views
25

在python單元測試(實際上是Django)中,正確的assert語句會告訴我測試結果是否包含我選擇的字符串?Python/Django:如何聲明單元測試結果包含某個字符串?

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

我想確保我的result包含至少我指定爲上面的第二個論點,即JSON對象(或字符串),{"car" : ["toyota","honda"]}

+0

會[https://docs.djangoproject.com/en/1.11/topics/testing/tools /#django.test.Response.json]幫助? – coya

回答

16
self.assertContains(result, "abcd") 

你可以修改它使用JSON的工作進行比較。

使用self.assertContains只適用於HttpResponse對象。對於其他對象,請使用self.assertIn

+2

是的,但由於JSON結構,它可能有一些空白補充,如果你想用Python字符串來比較其不在JSON的問題,但有問題的。 – francois

+20

assertContains並不旨在由用於其它目的比HttpReponse,更喜歡使用與assertTrue「中的」 Python關鍵詞代替(參見下面我answser)。 – Pcriulan

+9

這是錯誤的。 Assertconains用於http響應。 – kagronick

6

構建JSON使用json.dumps()的對象。

然後使用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

爲什麼使用的'assertTrue()'代替['assertEqual便()'](http://docs.python.org/3/library/unittest.html#unittest.TestCase.assertEqual)?至少使用'assertEqual()',模塊將打印結果和期望值。 –

+0

你說得對,assertEqual()更好。我無法找到鏈接,但我非常肯定已經在某處讀取使用assertTrue而不是assertEqual。很明顯,我錯了:)我會修正上面的例子。 –

+8

注意,這將是不可靠的,當你在任何字典不止一個關鍵,因爲'轉儲()'使用任意排序,我們不知道鑰匙在'result'排序。你會好得多使用'self.assertEqual(json.loads(結果),expected_dict)'。 –

13

你可以寫斷言大約在另一個字符串串的預期部分用一個簡單的assertTrue +在Python關鍵詞:

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

而這種策略的問題是能給形式的差失敗消息「Asse田:假是不是真正的」 – jamesc

-1

,我發現自己在一個類似的問題,我使用的屬性rendered_content,所以我寫了

assertTrue('string' in response.rendered_content),同樣

assertFalse('string' in response.rendered_content)如果我想測試一個字符串沒有呈現

但它也工作的早期建議的方法,

AssertContains(response, 'html string as rendered')

所以我說,第一個是更直接。 我希望這會有所幫助。

57

要斷言,如果一個字符串是或不是的另一個子,你應該使用assertInassertNotIn

# 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'] 
相關問題