【问题标题】:Set Faker's seed globally for Laravel's factories为 Laravel 的工厂在全球设置 Faker 的种子
【发布时间】:2019-07-21 03:53:18
【问题描述】:

我想每次使用已经存在的 Laravel (5.7) 工厂生成相同的数据。我看到 Faker 确实有一个设置种子的选项 - $faker->seed(123);,但这必须添加到每个工厂。
我一直在寻找一种方法来做到这一点,但没有成功。 $faker 是在Factory 类的构造函数中设置的,我想我可以扩展它并将种子方法添加到$faker。问题是此类在供应商文件helpers.php (line 495) 中使用,无法修改。有没有办法覆盖 Laravel 中的那些辅助函数?或者也许有一种更简单的方法,但我没有看到。

【问题讨论】:

  • 如果你想要每次都一样,为什么还要使用Faker?为什么不直接做$foo->bar = 'whatever';
  • 因为你不想自己写 500 次 "whatever $x" 但仍然想要可比较的结果,例如在测试环境中。

标签: php laravel factory faker


【解决方案1】:

只有当你注意到你总是会得到一些重复的结果时,Faker 才需要做种子。如果不是,我认为甚至不需要设置种子本身

【讨论】:

    【解决方案2】:

    \Illuminate\Database\Eloquent\Factory 类有一个额外的静态构造函数,它允许你传入你自己的 faker 实例,然后照常加载你现有的工厂。您可以按如下方式使用它:

    $faker = \Faker\Factory::create();
    $faker->seed(1234);
    $factory = \Illuminate\Database\Eloquent\Factory::construct($faker);
    
    // Then use the factory as follows
    $user = $factory->of(\App\User::class)->create();
    

    如果您需要在测试库的多个地方使用种子工厂,我建议您在 setUp() 方法中将其绑定到容器。

    【讨论】:

      【解决方案3】:

      对于寻找更新版本的任何人:

      public function setUp(): void
      {
          parent::setUp();
          app(\Faker\Generator::class)->seed(919237);
      }
      
      

      我们的用例是使测试具有确定性,同时保持播种机随机。

      【讨论】:

        猜你喜欢
        • 2018-11-08
        • 2021-06-29
        • 1970-01-01
        • 2016-08-18
        • 2019-05-18
        • 2020-02-26
        • 2018-11-11
        • 2016-10-17
        • 2018-08-18
        相关资源
        最近更新 更多