この記事で書いていること
- factory_boyのclassを定義する時に
factory.Factory
を継承してると、データが保存されない - 代わりに
factory.django.DjangoModelFactory
を継承しよう - 公式DOCSで最初に出てくる例が
factory.Factory
を継承していてその先をちゃんと読まなかった。反省。
factory.Factoryを継承すると、データがsaveされない
factoryのクラスを定義する時に、以下のようにfactory.Factoryを継承すると、テスト内で使う時にデータがsaveされません。
そのため、作られたテストデータが保存されていることを前提とする処理が必ずfailしてしまいます。
例えば、UpdateとかDeleteとかのテストは全部失敗してしまいます。
テストデータを作った時に、ちゃんと保存してほしい時はこうすればいい
class CustomerFactory(factory.django.DjangoModelFactory):
class Meta:
model = Customer
name = "石原さとみ"
gender = "女性"
age = 31
そうすると、以下のようなテストも無事通ります。
class TestEditView(TestCase):
def test_edit_http_get(self):
CustomerFactory.create()
response = self.client.get("/customer/1/edit")
self.assertEqual(response.status_code, 200)
公式Docsはある程度まで読むべき
公式DOCSのURLはこちら。
https://factoryboy.readthedocs.io/en/latest/index.html#
見てもらえるとわかる通り、最初の方の例は全部factory.Factoryになっています。
私はこれに飛びついた結果、ビミョーに時間を取られてしまいました。
Introductionの下の方にあるstrategiesまで読めば、継承すべきはDjangoModelFactoryだとわかったはずでした。
Introductionくらいは全部読むべき。反省。