在PHPUnit提供程序中使用工厂失败

本教程将介绍在PHPUnit提供程序中使用工厂失败的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

在PHPUnit提供程序中使用工厂失败 教程 第1张

问题描述

我正在尝试使用模型工厂在数据提供程序中创建模型。如果我在Setup方法或直接在测试中使用工厂,它可以工作,但是如果我试图在数据提供程序中使用它,我会得到一个错误:

1)警告

为MyClassTest::testSomeMethod指定的数据提供程序无效。

找不到名称为[默认][AppModelUser]的工厂。

工厂定义:

/** @var IlluminateDatabaseEloquentFactory $factory */
$factory->define(AppModelUser::class, function (FakerGenerator $faker) {
 static $password;

 return [
  'id' => $faker->unique()->numberBetween(1, 10000),
  'email_address' => $faker->unique()->safeEmail,
  'remember_token' => str_random(10),
  'password' => $password ?: $password = bcrypt('secret'),
 ];
});

$factory->state(AppModelUser::class, 'guest', function ($faker) {
 return [
  'role_id' => 9999,
 ];
});

我给工厂的电话:

factory(AppModelUser::class)->states('guest')->make();

是来自Laravel的错误还是我在这里遗漏了什么?

编辑:

经过一些调试后,我发现在数据提供程序调用之前没有加载工厂定义,它们是在调用setUp()方法时调用(即定义的)的,这发生在数据提供程序调用之后,因此它在数据提供程序中找不到工厂。

所以在我看来,在数据提供程序(或测试类中的任何静电方法)中使用工厂是不可能的。
否则,我应该在我的数据提供程序方法中定义工厂!

推荐答案

我在另一个问题(由同一问题引起)中找到了答案

因此,这个问题可以通过根据this answer在数据提供者方法中调用$this->createApplication();$this->refreshApplication();来解决。
或者根据this answer

在构造函数中调用它

代码将如下所示

public function dataProvider() {
 $this->refreshApplication(); // or $this->createApplication();
 $user = factory(AppModelUser::class)->states('guest')->make();

 // ...
 // another code to generate data ....
 // ...

 return $someFakeData;
}

我尝试过并取得了成效,虽然我觉得这是一种变通办法,而不是事情应该怎么工作,但任何"更干净"的建议都将不胜感激。

好了关于在PHPUnit提供程序中使用工厂失败的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。