Using factory in PHPUnit provider fails(在PHPUnit提供程序中使用工厂失败)
本文介绍了在PHPUnit提供程序中使用工厂失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用模型工厂在数据提供程序中创建模型。如果我在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提供程序中使用工厂失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:在PHPUnit提供程序中使用工厂失败
基础教程推荐
猜你喜欢
- 在 Woocommerce 中根据运输方式和付款方式添加费用 2021-01-01
- Libpuzzle 索引数百万张图片? 2022-01-01
- 在多维数组中查找最大值 2021-01-01
- XAMPP 服务器不加载 CSS 文件 2022-01-01
- WooCommerce 中选定产品类别的自定义产品价格后缀 2021-01-01
- 超薄框架REST服务两次获得输出 2022-01-01
- mysqli_insert_id 是否有可能在高流量应用程序中返回 2021-01-01
- 通过 PHP SoapClient 请求发送原始 XML 2021-01-01
- 在 PHP 中强制下载文件 - 在 Joomla 框架内 2022-01-01
- 如何在 PHP 中的请求之间持久化对象 2022-01-01