2013-01-18 8 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) 

ように、第2のテストを実行すると、私はエラーTypeError: argument of type 'NoneType' is not iterableを取得します。私は、response.contentには期待しているページが含まれていること、ステータスコードが正しいこと、そしてテンプレートが正しいことを、2番目のテストでprintステートメントによって確認しました。しかし、第2のテストでは、応答の文脈は一貫してNoneです。

標準の "python manage.py test ..."インターフェイスでDjangoユニットテストを実行しているので、 "context is empty from the shell"という問題が発生しているとは思われません。

これは何が起こっているのですか?

編集:

私は<class 'django.forms.formsets.AFormFormSet'>を得る作業をテストするために、各テストにprint type(resp.context['a_formset'])を追加した場合。不合格のテストのために、私はTypeError: 'NoneType' object has no attribute '__getitem__'をもう一度得る。

+0

'a_form'はフォームセットですか? – sneawo

+0

@sneawoええ、それはformsetです。 –

+1

作業テストと非作業テストの両方で、一時的に 'print type(resp.context ['a_formset'])'行を追加してください。あなたはあなたが期待しているものを得ていないかもしれません。 –

答えて

4

今日私は同じ問題を抱えています。 テストでは、同じページには、私が研究を行い、 1)テスト・クライアントはコンテキストを移入するための信号を使用することがわかった

response.contextで何もしています取得 2私の見解方法は、第二の試験

のために呼び出されません)

デバッガをオンにして、有罪判決が「ミドルウェアのキャッシュ」であることが判明しました。 this ticketとこのSO question(後者には解決策があります)が見つかりました。

したがって、短い:ビューからではなく、キャッシュから2番目のリクエストが提供されるため、ビューは実行されず、テストクライアントは信号を取得せず、コンテキストにデータを投入する能力を持ちません。

私は私のプロジェクトのためのキャッシュミドルウェアを無効にすることはできませんので、私は私の設定に次のハックラインを追加しました:

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

・ホープこれは誰か

5

を助けあなたには、いくつかのエラーに遭遇したので、終了していますシェルを再起動しました。

しかし、あなたは...環境を開始するために私の問題だった

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

を忘れてしまいました。それがうまくいくと思います...

+0

これは完璧に働いた、ありがとう – intelis

関連する問題