3

意味があり機能するデータ モデルのテストを作成したい

私はLaravel のボスのようなモデルをテストしようとして遊んでいます(現在、私は中間管理職の地位を維持するのに苦労していると言えます)。私はArdent自分のデータモデルに使用しています。Factory Muff上で参照されている記事は、非常に素晴らしいように見え、モック オブジェクトの作成を容易にするのに非常に便利です。

Factory Muffしかし、深く掘り下げると、提供できるデータが非常に限られていることがわかります。基本的にランダムな言葉とメールアドレスです。それ以上のものは、静的メソッドをデータ モデルに記述して、モック オブジェクトの有効なデータを生成する必要があるようです。それはあまり役に立たないように思えますが、私はおそらくそれを間違ってやっていると推測していFactory Muffます。

データモデルで

次のデータ検証ルールセットを検討してください。

public static $rules = [
    'property' => 'required|address',
    'name'     => 'required|name',
    'email'    => 'required|email',
    'phone'    => 'required|phone',
    'dob'      => 'required|date',
];

Factory Muff正しい形式でフォーマットされたデータを生成する静的メソッドを書きたくない限り、名前と電子メールアドレスを超えてこのデータを生成するのにはまったく適していないようです。これは、検証エラーを発生させずにモックオブジェクトを作成できるようにするために私がしなければならないと思うことです:Factory Muff

public static $factory = [
    'property' => 'call|makeStreetAddress',
    'name'     => 'string',
    'email'    => 'email',
    'phone'    => 'call|makePhone',
    'dob'      => 'date|makeDate',
];

public static function makeStreetAddress()
{
    $faker = \Faker\Factory::create();
    return $faker->streetAddress;
}

public static function makePhone()
{
    $faker = \Faker\Factory::create();
    return $faker->phoneNumber;
}

public static function makeDate()
{
    $faker = \Faker\Factory::create();
    return $faker->date;
}

これは、特にテーブルに 10 から 20 のフィールドがある場合、かなり冗長に見えます。また\Faker\Factory::create()、すべての静的メソッド呼び出しを呼び出すのも好きではありません (具体的な理由はありません。単に好きではないだけです。回避策を知っている場合、または私の恐怖に根拠がない場合は、お知らせください。 .)

データベース シーダーで

開発とテストで使用するために、データベースに大量のガベージを生成するために使用するデータベース シード スクリプトをセットアップしました。Fakerとても直感的で使いやすいです。たとえば、これは上記のデータ セットのシード スクリプトです。

$faker = \Faker\Factory::create();

$application = Application::create([
    'property' => $faker->streetAddress,
    'name'     => $faker->name,
    'email'    => $faker->email,
    'phone'    => $faker->phoneNumber,
    'dob'      => $faker->dateTimeBetween('-60 years', '-18 years'),
]);

自分がここで何をしているのかを考えれば考えるほど、余計なことをしているように感じます。

質問

  1. テストを実行する前にによって生成されたガベージ データをデータベースにシードしている場合、モック オブジェクトを作成するFaker必要さえありますか? Factory Muffデータベースからのシード データを使用して、コードベースを適切にテストできないでしょうか? なぜ私は嘲笑する必要があるのですか?
  2. 私は全体の要点を逃していFaker Muffますか? 利点はありますか?ランダムワードジェネレーターに過ぎないように思えます。
  3. 私は何を間違っていますか?私はTDDに非常に興味がありますが、とても気が遠くなります。私のコードに悪い慣行やベスト プラクティスの欠如に気付いた場合は、お知らせください。
4

1 に答える 1

2

ここで2つの異なる概念を混同していると思います。

まず、作成するデータFaker(この場合はデータベースのシード処理) の目的は、アプリケーションで実際のシナリオをシミュレートすることです。たとえば、ブログ プラットフォームを開発している場合、それを使用して、タグ、ユーザー コメント、著者コメントを含むブログ投稿を作成できます。

テストに関しては、これを機能テストまたは受け入れテストで使用できます。test tag page shows posts tagged with X tagたとえば、やのようなものをテストしたい場合test user can only delete his own comments、データを利用Fakerして、以前の投稿、タグ、およびコメントを操作できます。


一方、FactoryMuff任意のモデルのインスタンスをすばやく作成できます。Postモデルの検証方法を単体テストする場合のシナリオを考えてみましょう。

// 1. create new Post
// 2. fill it with data
// 3. try to validate

FactoryMuff新しいモデルを作成し、ステップ 1 と 2 を実行するため、ここではデータベースをシードすることは役に立ちません。また、単体テストを行うときは、分離して実行する必要があるため、データベースにまったく触れる必要がないことに注意してください。代わりに、データベース オブジェクトをモックして、偽のモデルとその可能な関係を返すことができます (FactoryMuff再び救助に)。


最後に、アプリケーションがまだ小さいため、機能の利点をFactoryMuff理解していない可能性があると思いますが、コードベース (およびテスト) が大きくなるにつれて、いくつかの静的メソッドを書くことを気にすることはありません。

于 2013-12-13T09:15:00.477 に答える