作者:我的 | 来源:互联网 | 2023-01-29 14:22
我正在尝试使用模型工厂在数据提供程序中创建模型。如果我在设置方法中或直接在测试中使用工厂,则可以使用,但是如果我尝试在数据提供程序中使用它,则会出现错误:
1)警告
为MyClassTest :: testSomeMethod指定的数据提供者无效。
无法找到名称为[default] [App \ Model \ User]的工厂。
工厂定义:
/** @var \Illuminate\Database\Eloquent\Factory $factory */
$factory->define(\App\Model\User::class, function (Faker\Generator $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(\App\Model\User::class, 'guest', function ($faker) {
return [
'role_id' => 9999,
];
});
我给工厂打电话:
factory(\App\Model\User::class)->states('guest')->make();
是Laravel的错误,还是我在这里错过了一些东西?
编辑:
经过一些调试之后,我发现工厂定义没有在数据提供者调用之前加载,而是在调用setUp()方法时(即在数据提供者调用之后发生)调用了(即定义了)工厂定义,因此找不到工厂在数据提供者中。
因此在我看来,不可能在数据提供程序中使用工厂(或测试类中的任何静态方法)。否则我应该做一些事情来在我的数据提供者方法中定义工厂!
1> Alaa AL-Zaib..:
我在另一个问题(由同一问题引起)中找到了答案
因此,可以根据此答案通过调用$this->createApplication();
或$this->refreshApplication();
在数据提供者方法中解决此问题,或根据此答案在构造函数中调用它来解决此问题
该代码将如下所示
public function dataProvider() {
$this->refreshApplication(); // or $this->createApplication();
$user = factory(\App\Model\User::class)->states('guest')->make();
// ...
// another code to generate data ....
// ...
return $someFakeData;
}
我尝试过并工作了,尽管我觉得这是一种解决方法,而不是事情应该如何工作,但任何“更清洁”的建议都会受到赞赏。