13

同じテストケースクラスの別のテストに合格するアサーションで失敗する単体テストがあります。

合格テストは次のとおりです。

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)

2番目のテストでは、エラーが発生しますTypeError: 'NoneType' object has no attribute '__getitem__'

2番目のテストを次のように実行すると

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。2番目のテストのprintステートメントを使用して、response.contentに取得する予定のページが含まれていること、ステータスコードが正しいこと、およびテンプレートが正しいことを確認しました。ただし、応答のコンテキストは一貫Noneして2番目のテストにあります。

Djangoの単体テストを標準の「pythonmanage.pytest...」インターフェースで実行しているので、「コンテキストがシェルから空です」という問題が発生しているとは思いません。

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

編集:

print type(resp.context['a_formset'])各テストに追加すると、動作テストに対してが得られ<class 'django.forms.formsets.AFormFormSet'>ます。動作しないテストについては、私はTypeError: 'NoneType' object has no attribute '__getitem__'再び取得します。

4

3 に答える 3

8

エラーが発生し、シェルを終了して再起動したためです。

しかし、環境を開始するのを忘れていました...

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

それが私の問題でした。それがうまくいくことを願っています...

于 2014-01-30T10:47:58.797 に答える
5

今日、私は同じ問題に遭遇しました。2 番目のテストでは、response.context に何もない同じページが取得されます

調査を行ったところ、1) テスト クライアントがシグナルを使用してコンテキストを設定している、2) ビュー メソッドが 2 番目のテストで呼び出されていないことがわかりました

デバッガーを起動したところ、有罪なのは「キャッシュミドルウェア」であることがわかりました。このチケットとこのSOの質問を見つけたことを知っています(後者には解決策があります)。

要するに、2 番目のリクエストはビューからではなくキャッシュから提供されるため、ビューは実行されず、test-client はシグナルを取得せず、コンテキストを入力する機能がありません。

プロジェクトのキャッシュ ミドルウェアを無効にできないため、設定に次のハック行を追加しました。

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

これが誰かを助けることを願っています

于 2013-06-19T11:06:20.997 に答える