0

私はこのような一般的な見方をしています:

class SaveView(CreateView):

    def get_initial(self):
        # Get the initial dictionary from the superclass method
        initial = super(SaveView, self).get_initial()
        # Copy the dictionary so we don't accidentally change a mutable dict
        initial = initial.copy()
        initial['user'] = self.request.user
        return initial

このビューにはlogin_requiredデコレータがあるため、self.request.user常に有効です。

ブラウザでページにアクセスしているときは、すべて正常に機能していますが、テストは失敗しています。次のテスト設定があります。

from django.test import TestCase, client

class MyTest(TestCase):
    def setUp(self):
        self.client = client.Client()
    def test1(self):
        self.assertTrue(self.client.login(username='user1',password='password1'))
        data = {'name':'test 1'}
        response = self.client.post('/app/save/', data)
        self.assertEqual(response.status_code, 302)

'/ app / save /'はそのビューを呼び出すURLです(ブラウザでは完全に機能しています。私のモデルには2つの必須フィールド"name"と"user"があるため、作成されたオブジェクトページへのリダイレクトが発行されます。データを介して名前を渡し、ユーザーはget_initialメソッドから取得する必要があります。

確かに、これは「実際の生活」、つまりブラウザで起こることです。

このテストに合格させる唯一の方法は、データディクショナリの「ユーザー」に合格することです。

これはdjango.testモジュールのバグですか、それとも予想される動作であり、その理由は何ですか?

前もって感謝します

4

1 に答える 1

1

これは予想される動作です。初期データに関するDjangoドキュメントから:

initial引数を使用すると、このフィールドをバインドされていないフォームでレンダリングするときに使用する初期値を指定できます。

テストでデータを投稿するときは、バインドされたフォームを使用しているため、初期データは使用されません。user必須フィールドが欠落しているため、フォームは無効です。そのため、フォームエラーを表示する200応答が返されます。これは、ブラウザのユーザーフィールドをクリアしてフォームを送信した場合と同じです。

データにユーザーを含める必要がありますpost。そうすると、テストに合格します。

于 2012-01-27T13:51:46.580 に答える