2013-01-18 24 views
9

我有一個單元測試失敗的斷言,通過在同一個測試用例類的另一個測試。Django單元測試客戶端響應具有空的上下文

下面是測試通過:

def test_home(self): 
    c = Client() 
    resp = c.get('/') 
    self.assertEqual(resp.status_code, 200) 
    self.assertTrue('a_formset' in resp.context) 

下面是失敗的測試:

def test_number_initial_number_of_forms(self): 
    c = Client() 
    resp = c.get('/') 
    self.assertEqual(resp.context['a_formset'].total_form_count(), 1) 

在第二次測試,我得到的錯誤TypeError: 'NoneType' object has no attribute '__getitem__'

如果我執行第二次測試爲

def test_number_initial_number_of_forms(self): 
    c = Client() 
    resp = c.get('/') 
    self.assertTrue('a_formset' in resp.context) 
    self.assertEqual(resp.context['a_formset'].total_form_count(), 1) 

我得到的錯誤TypeError: argument of type 'NoneType' is not iterable。我已經通過第二個測試中的打印語句證實了response.content包含我期望得到的頁面,狀態碼是正確的,並且模板是正確的。但是在第二個測試中響應的上下文始終是None

我正在通過標準的「python manage.py test ...」界面運行我的Django單元測試,所以我不相信我遇到了「context is empty from the shell」問題。

這是怎麼回事?

編輯:

如果我添加print type(resp.context['a_formset'])每個測試,對於測試的工作,我得到<class 'django.forms.formsets.AFormFormSet'>。對於非工作測試,我再次獲得TypeError: 'NoneType' object has no attribute '__getitem__'

+0

'a_form'是一個formset? – sneawo

+0

@sneawo是的,這是一個formset。 –

+1

在您的工作和非工作測試中,臨時添加'print type(resp.context ['a_formset'])''行。你可能沒有得到你所期望的。 –

回答

4

今天我遇到了同樣的問題。該第二測試得到相同的頁面無關,在response.context

我做了一個研究,發現 1)測試客戶端使用信號來填充背景, 2)我的觀點方法不要求第二次測試

我打開一個調試器,發現有罪的是'緩存中間件'。知道我找到了this ticketSO question(後者有一個解決方案)。

因此,簡而言之:第二個請求是從緩存中,而不是從一個視圖,從而不執行視圖和測試客戶端沒有得到信號,並沒有能力來填充背景。

我不能爲我的項目禁用緩存中間件,所以我加了下一個黑客線進入我的設置:

if 'test' in sys.argv: 
    CACHE_MIDDLEWARE_SECONDS = 0 

希望這可以幫助別人

5

這是因爲你遇到了一些錯誤,退出外殼並重新啓動它。

但是你忘了啓動環境 ...

from django.test.utils import setup_test_environment 
>>> setup_test_environment() 

這是我的問題。希望它有效...

+0

這很好,謝謝 – intelis

相關問題