2016-08-09 7 views
3

私は更新フォームとビューをユニットテストしようとしています。私は、私の作成フォームと更新フォームの両方にDjango Crispy Formsを使用しています。 UpdateFormはCreateFormを継承し、送信ボタンのテキストを少し変更します。 CreateViewとUpdateViewは非常によく似ています。モデル、テンプレート、およびsuccess_urlは同じです。それらはそれぞれのフォームを使用する点で異なり、CreateViewはdjango.views.generic.CreateViewを継承し、UpdateViewはdjango.views.generic.edit.UpdateViewを継承します。Django:単体テストの更新ビュー/フォーム

ウェブサイトは正常に動作します。問題なくオブジェクトを作成して編集することができます。しかし、私の2番目のテストは失敗します。 UpdateFormをテストするにはどうすればよいですか?

ご協力いただければ幸いです。ありがとう。

このテストに合格:

class CreateFormTest(TestCase): 

    def setUp(self): 
     self.valid_data = { 
      'x': 'foo', 
      'y': 'bar', 
     } 

    def test_create_form_valid(self): 
     """ Test CreateForm with valid data """ 
     form = CreateForm(data=self.valid_data) 
     self.assertTrue(form.is_valid()) 
     obj = form.save() 
     self.assertEqual(obj.x, self.valid_data['x']) 

このテストは失敗します。

class UpdateFormTest(TestCase): 
    def setUp(self): 
     self.obj = Factories.create_obj() # Creates the object 

    def test_update_form_valid(self): 
     """ Test UpdateForm with valid data """ 
     valid_data = model_to_dict(self.obj) 
     valid_data['x'] = 'new' 
     form = UpdateForm(valid_data) 
     self.assertTrue(form.is_valid()) 
     case = form.save() 
     self.assertEqual(case.defendant, self.valid_data['defendant'] 
+2

あなたが探しているものは 'form = UpdateForm(instance = self.obj) 'です。 – IanAuld

+0

これはそのトリックでした。ありがとうございました!あなたが答えを出したら、私はそれを受け入れます。 – Eric

答えて

3

すでにあなたが渡すinstanceキーワード引数を使用することができます作成​​されたオブジェクトとModelFormを事前移入フォームにオブジェクト。

form = SomeForm(instance=my_obj) 

これは、OP <または既に作成されたオブジェクトを編集するための図のように、試験中に行うことができます。 save()を呼び出すと、既存のオブジェクトは新しいオブジェクトを作成する代わりに更新されます。

+0

これはアンバウンド形式です。 'is_valid'を呼び出すとエラーなしで' False'が返されます。 – surfer190