0

私は単体テストに非常に慣れておらず、おそらく何か間違ったことをしていますが、投稿をシミュレートして管理バックエンド経由でモデルを更新するとsave_model、AdminForm のメソッドが呼び出されていないようです。このメソッドをテストしようとしています - 何が間違っていますか?

あまり関係のない 2 番目の質問は、一般に、単体テストを使用するときにメソッドが呼び出されていることを確認するにはどうすればよいですか? ヒットしたすべてのメソッドを一覧表示する方法はありますか?

以下は、私のテストが実行されているコードです。このsave_modelモデルの AdminForm のメソッドで、このモデルのfoobar属性を現在サインインしているユーザーのユーザー名に設定しました。以下は私のテストです:

self.client = Client()
self.client.login(username='username',password='password')
# self.dict is a dictionary of field names and values for mymodel to be updated
response = self.client.post('/admin/myapp/mymodel/%d/' % self.mymodel.id, self.dict)
self.assertEqual(response.status_code,200) # passes
self.assertEqual(self.mymodel.foobar,'username') # fails
self.client.logout()

それself.mymodel.foobarは空の文字列であると言うので失敗します。アップデート前はこうあるべきだった。foob​​ar の値は渡されませんself.dictが、私のsave_modelメソッドは、更新が発生したときにそれを独自に設定するように設計されています。また、コードが正しく動作し、正常に動作しているように見えることも注目に値しますがsave_model、テストが失敗しているだけです。私はTDDの完全な初心者なので、問題はコードではなくテストにあると確信しています。考え?

4

1 に答える 1

0

self.mymodelコードから、フォームを投稿した後、データベースからリロードしないことが問題のようです。データベースに格納されているモデル オブジェクトへの参照を保持していて、そのオブジェクトの 1 つ以上のフィールドがデータベースで変更された場合、更新された値を表示するには、データベースからオブジェクトを再読み込みする必要があります。この質問で詳しく説明されているように、次のような方法でこれを行うことができます。

self.mymodel = MyModelClass.objects.get(id=self.mymodel.id)

2 番目の質問に答えるには、おそらく何が起こっているかを確認する最も便利な方法は、ログを使用してメソッドで何が起こっているかを出力することです。save_modelこれは、テスト中に問題をデバッグするのに役立つだけでなく、アプリケーションの実行時にこのメソッドを使用します。ロギングの django ガイドは優れた紹介を提供します。

https://docs.djangoproject.com/en/dev/topics/logging/

于 2013-06-18T18:23:44.413 に答える