19

Django テストで直接 ORM/モデル インスタンスを作成するよりも factory_boy が好まれる理由がわかりません。factory_boy の Web サイトでは、それを使用する利点についてほとんど説明していません。

管理が難しい、遅いなどのフィクスチャの代替として理にかなっています。

しかし、テストの必要に応じてモデル インスタンスを作成しないのはなぜでしょうか?

factory_boy が db への書き込みを完全に置き換えた場合、問題ありません。この場合、非常に便利だと思いますが、工場の少年が作成した django モデル インスタンスは引き続きデータベースと対話します。

もう 1 つの潜在的な利点は、シーケンスのサポートですが、ファクトリー ボーイを必要とせずにシーケンス/サンプル データを作成することは難しくありません。

全体として、ファクトリ ボーイを使用しても、オブジェクト/モデル インスタンスを直接作成しても、ほとんどメリットがありません。

明らかに明らかな何かが欠けていることを願っています!

4

1 に答える 1

23

はい、django ORM を直接使用してテスト データを準備できます。しかし、ファクトリを使用することには利点があり、factory_boy具体的には、私が覚えて使用しているものの一部を次に示します。

  • モデルファクトリは、きれいで読みやすい方法で定義されています。

    class CasesFactory(factory.Factory):
        FACTORY_FOR = models.Case
    
        number = factory.Sequence(lambda n: '1021-{0}'.format(n))
        create_date = datetime.datetime.now()
    
  • このクラスベースのアプローチのもう 1 つの利点は、SubFactoryを作成できることです。

  • また、さまざまな種類のリレーションシップのファクトリを簡単に定義できます: ForeignKey、 reverse ForeignKeyManyToMany( documentation )

  • きちんとしたDjangoModelFactoryクラス
  • Sequences (あなたが述べたように)データをより「動的」にするのに役立ちます。自分で処理することを想像してください。
  • mute_signalsデコレータ - テスト中にシグナルをディスパッチしたくない場合があります

基本的に、factory_boyテストデータを生成するための「ヘルパー」関数を書くことを避けるためにあります。代わりに、素晴らしく使いやすいインターフェースを導入します。

自問してみてください: なぜ車輪の再発明をする必要があるのですか? その仕事専用のツールがあるのでしょうか?

以下も参照してください。

于 2014-04-28T19:56:53.470 に答える