0

単体テストで投稿しているフォームを含む Django ビューがあります。テストの一般的な構造は次のとおりです。

class ViewTests(TestCase):
    form_url = reverse_lazy('myapp:form')
    success_url = reverse_lazy('myapp:success')

    def test_form_submission_with_valid_data_creates_new_object_and_redirects(self):
        attributes = EntryFactory.attributes()
        attributes['product'] = ProductFactory()  # Entry has a ForeignKey to Product
        response = self.client.post(self.form_url, attributes, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertRedirects(response, self.success_url)
        self.assertTemplateUsed(response, 'myapp/success.html')

ただし、リダイレクトが期待どおりに機能しない理由がわかりません。import pdb; pdb.set_trace()フォーム エラー ( ) があるかどうかを確認するためにドロップしようとしましたresponse.context['form'].errorsが、返されるのは空の dict だけです。ブラウザでフォームを送信すると適切にリダイレクトされるため、単体テストが失敗する理由がわかりません。また、フォーム エラー dict にエラーが表示されないため、適切にデバッグする方法もわかりません。

4

1 に答える 1

0

いくつかの間違いがあったことが判明しました。

まず、実際にはページに 2 番目のフォーム ( を選択するためProduct) がありましたが、それを見逃していました。関連して、私はではなくに割り当てる必要がありましProductFactory().idた。attributes['product']ProductFactory

assertRedirects第二に、そのビットを変更した後、 ;に問題がありました。プロキシとの比較を実行できないため、に変更self.success_urlする必要がありました。unicode(self.success_url)assertRedirects

最終製品:

def test_form_submission_with_valid_data_create_new_entry_and_redirects(self):
    attributes = EntryFactory.attributes()
    attributes['product'] = ProductFactory().id
    response = self.client.post(self.form_url, attributes)
    self.assertRedirects(response, unicode(self.success_url))
于 2013-10-17T21:35:00.117 に答える