3

Django で最初の単体テストを作成しようとしています。スタッフ登録フォームです。フォームの Staff モデルには、UserProfile (AUTH_PROFILE_MODULE) との OneToOne 関係があります。UserProfile は、django.contrib.auth.models.User と OneToOne の関係にあります。

https://github.com/dnerdy/factory_boyを使用して、staff モデルのテスト モデル インスタンスを作成しています。アイデアは、テスト モデル インスタンスを簡単に作成できるように、StaffFactory を使用することです。バインドされたフォームを作成するには、データ dict を渡す必要があります。フォームをテストするときに、 django.forms.models.model_to_dictを使用してモデル インスタンスをデータ dict に変換すると便利だと思いました。

さて、私の問題は次のとおりです。model_to_dict が Staff モデルの外部キーをトラバースしません (Staff->UserProfile->User)。これは、ユーザーの電子メールなどの必須フィールドがまだフォーム データ内にないため、フォームが無効のままであることを意味します。

現在、私の StaffRegistrationFormTest は次のようになります。

class StaffRegistrationFormTest(unittest.TestCase):
  def test_success(self):
    staff1 = StaffFactory()

    form = StaffRegistrationForm(model_to_dict(staff1))
    # print jsonpickle.encode(model_to_dict(staff1))
    self.assertTrue(form.is_valid(), form.errors)

モデル インスタンスを再利用して外部キーをシリアル化する dict を渡す方法はありますか?

4

1 に答える 1

2

したがって、これを解決する1つの方法は、StaffモデルのOneToOneフィールドに追加のディクショナリを作成し、それらをマージすることであるように見えます。

これにより、テストに合格します。

    data = dict(model_to_dict(staff1).items() + 
        model_to_dict(staff1.profile).items() +
        model_to_dict(staff1.profile.user).items())
    form = StaffRegistrationForm(data=data)
    self.assertTrue(form.is_valid(), form.errors)

これがベストプラクティスの観点から進むべき方法であるかどうかはわかりません。これが完全に穀物に反する場合は、コメントしてください。

于 2012-07-24T21:18:31.177 に答える