7

わかりましたので、ビューのより正確なフォームを単体テストする必要があります。だから私はそのような単体テストを作成します。

class ViewTest(TestCase):
    fixtures = ['fixture.json']
    def setUp(self):
        self.client = Client()
    def test_company_create(self):
        post_data = {
            'form-0-user': '',
            'form-0-share': '',
            'form-TOTAL_FORMS': 1,
            'form-INITIAL_FORMS': 0,
            'form-MAX_NUM_FORMS': 10
        }
    resp = self.client.post('/company/create/', post_data)
    self.assertFormError (resp, 'shareholder_formset', 'share', 'This field is required.')
    self.assertFormError (resp, 'shareholder_formset', 'user', 'This field is required.')

もちろん、私はエラーを返します

AttributeError: 'ShareholderFormFormSet' オブジェクトに属性 'fields' がありません

フォームセットにはフィールドではなくフォームが含まれているため、フォームセットをテストする正しい方法は何ですか?

4

3 に答える 3

2

これは機能テストです (ビューを通過するため、モデルを保存する場合はモデルを要求するなど)。

フォームについては、django-webtest の方がはるかに使いやすいです。これらの詳細について心配する必要はありません: https://pypi.python.org/pypi/django-webtest

于 2013-09-04T00:51:47.200 に答える
0

ご指摘のとおり、assertFormError のフォーム名引数は、実際には response.context_data の単なるキーです。使用しているキーは、フォームセット内のフォームのリストを返します。あなたが発見したように、それは assertFormError では機能しません。

1 つのオプションは、assertEqual を使用して直接比較することです。何かのようなもの:

self.assertEqual(response.context_data[u'shareholder_formset'][form_index].errors['share'], 'This field is required.')

また、IDE (PyCharm) がこれを理解するのに大いに役立ったことにも言及したいと思います。私は同様の問題に取り組んでいました。デバッガーをオンにし、post() の呼び出しの後にブレーク ポイントを配置し、応答を調べると、解決策が得られました。

于 2014-08-15T22:39:18.683 に答える