factory_boy: SubFuctory で ForeignKeyフィールドを初期化する
factory_boy はテストデータを簡単に作るためのライブラリです²。ForeignKey フィールドのインスタンスのデフォルトを定義するには、SubFactory を使う方法があります¹⁴。例えば、以下のように書けます。
| |
この場合、CoopFactory を使って Coop インスタンスを作ると、PhoneContactFactory も使って PhoneContact インスタンスを作り、そのインスタンスを Coop の phone フィールドにセットします。
もしくは、SelfAttribute を使う方法もあります⁴。例えば、以下のように書けます。
| |
この場合、RecordingFactory を使って Recording インスタンスを作るときに language パラメータを指定すると、その値が SubtitlesFactory の language パラメータにも渡されます。
ソース: Bing との会話 2023/4/30
- (1) テストコードを書く前にfactory_boyを学ぶべき - Qiita. https://qiita.com/AJIKING/items/ba53d215014989be311c.
- (2) With Django Factory Boy, how do I generate a factory for a …. https://stackoverflow.com/questions/62418415/with-django-factory-boy-how-do-i-generate-a-factory-for-a-foreign-key.
- (3) How to create factory-boy factories for Django models with …. https://stackoverflow.com/questions/39345286/how-to-create-factory-boy-factories-for-django-models-with-the-same-foreign-key.
- (4) How to handle ‘self’ Foreign key relation in factory boy #173. https://github.com/FactoryBoy/factory_boy/issues/173.
- (5) factory_boy — Factory Boy stable documentation. https://factoryboy.readthedocs.io/en/stable/index.html.
はい、他にも方法があります。exclude を使う方法があります⁴。例えば、以下のように書けます。
| |
この場合、RecordingFactory を使って Recording インスタンスを作るときに language パラメータを指定しなくても、デフォルトの値 ’en’ が SubtitlesFactory の language パラメータに渡されます。しかし、language パラメータは Recording のモデルには存在しないので、exclude に指定して除外します。
ソース: Bing との会話 2023/4/30
- (1) Reference — Factory Boy stable documentation. https://factoryboy.readthedocs.io/en/stable/reference.html.
- (2) How to create factory-boy factories for Django models with …. https://stackoverflow.com/questions/39345286/how-to-create-factory-boy-factories-for-django-models-with-the-same-foreign-key.
- (3) テストコードを書く前にfactory_boyを学ぶべき - Qiita. https://qiita.com/AJIKING/items/ba53d215014989be311c.
- (4) 【django】 pytest factory boyとfakerの使い方 | self-methods. https://self-methods.com/django-pytest-factory-boy-faker/.
exclude の方法は、factory_boy の機能の一つです。exclude に指定したフィールドは、Factory の内部で使われるだけで、モデルのインスタンスを作るときには渡されません。 その代わりに、SelfAttribute で他のフィールドに参照させることができます。 これは、モデルには存在しないが、Factory で使いたいフィールドを定義するときに便利です。
create の直後に refresh_from_db を行うには、post_generation で self.refresh_from_db() を呼ぶ方法があります⁴。例えば、以下のように書けます。
| |
この場合、UserFactory を使って User インスタンスを作るときに、create の直後に refresh_from_db が実行されます。
ソース: Bing との会話 2023/4/30
- (1) Using factory_boy with ORMs — Factory Boy stable …. https://factoryboy.readthedocs.io/en/stable/orms.html.
- (2) テストコードを書く前にfactory_boyを学ぶべき - Qiita. https://qiita.com/AJIKING/items/ba53d215014989be311c.
- (3) Dynamo DB ベースのアプリケーションをmotoとfactory_boyを用い …. https://qiita.com/kumapo/items/6ed21aaf3a9a8a374e96.
- (4) Pythonでのテストコードの作成・メンテナンスを少しでも楽にし …. https://qiita.com/penpenta/items/8cbc98cbc95ceefb8e0f.
- (5) [Django] 自動テストについてのまとめ - Qiita. https://qiita.com/okoppe8/items/eb7c3be5b9f6be244549.
- (6) Djangoを用いたボリュームテストに関するTips - Qiita. https://qiita.com/Asayu123/items/6813f1a0374762f11c5f.