【问题标题】:Minimize factories in test?尽量减少测试中的工厂?
【发布时间】:2023-03-29 00:01:01
【问题描述】:

目前我在测试类中使用了很多工厂factory(),有没有办法减少到1,所以我只能在测试方法中使用factory(Something::class)

我使用很多的原因是因为我必须传递一些外键。

$user = factory(User::class)->create();

$token = factory(Token::class)->create([
    'user_id' => $user->id,
]);

$provider = factory(Provider::class)->create([
    'user_id'       => $user->id,
    'token_id'      => $token->id,
]);

$something = factory(Something::class)->create([
    'provider_id' => $provider->id,
]);

   // Now test with $something

【问题讨论】:

  • 您需要知道$user 或任何外键吗?或者只是用$something做点什么?
  • 我不在乎是哪个$user。全厂都用faker,
  • 我只需要将factory(Something::class) 与$something 一起使用

标签: php laravel laravel-5 phpunit laravel-5.4


【解决方案1】:

你可以使用这样的语法:

$factory->define(Something::class, function ($faker) {
    return [
        'title' => $faker->title,
        'content' => $faker->paragraph,
        'provider_id' => function () {
            return factory(Provider::class)->create()->id;
        }
    ];
});

$factory->define(Provider::class, function ($faker) {
    $user = factory(User:class)->create();
    return [
        'user_id' => $user->id,
        'token_id' => function () {
            return factory(Token::class)->create(['user_id' => $user->id])->id;
        }
    ];
});

然后在你的测试中你只能使用:

$something = factory(Something::class)->create();

请注意,根据您的需要,它可能会导致一些副作用 - 例如,当使用 Provider 工厂时,将始终根据您的测试创建用户可能是好的还是不好的。当然,如果需要,您始终可以创建帮助方法,该方法将包装您显示的所有方法并仅返回一些内容,然后在您的测试中您只能使用:

$something = $this->createSomething();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多