编写一些单元测试,我想在完成类中的测试之前创建一个对象。因此,我设置了setUpBeforeClass()
方法:
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Location;
class UserTests extends TestCase {
const FAKEID = 9999999;
public static function setUpBeforeClass() : void {
parent::setUpBeforeClass();
factory(Location::class)->make(["id" => self::FAKEID])->save();
}
}
但是当我尝试运行它时,出现此错误:
InvalidArgumentException: Unable to locate factory with name [default] [App\Location].
但是工厂类设置正确。实际上,如果我将同一行下移到我的测试功能之一,则效果很好。
public function testCreateUser() {
factory(Location::class)->make(["id" => self::FAKEID])->save();
// do other stuff...
}
setUpBeforeClass()
唯一与我不同的地方是它是一个静态方法,但是我不知道为什么这样做会阻止工厂类工作。
答案 0 :(得分:0)
Laravel在setUp()
类的TestCase
方法中做了很多设置。在此之前调用setUpBeforeClass()
方法,这就是为什么尚未加载工厂的原因。
Laravel的TestCase
类setup
方法(see class):
/**
* Setup the test environment.
*
* @return void
*/
protected function setUp()
{
if (! $this->app) {
$this->refreshApplication();
}
$this->setUpTraits();
foreach ($this->afterApplicationCreatedCallbacks as $callback) {
call_user_func($callback);
}
Facade::clearResolvedInstances();
Model::setEventDispatcher($this->app['events']);
$this->setUpHasRun = true;
}
将您的代码更改为使用setUp
:
protected static function setUp() : void
{
parent::setUp();
factory( Location::class )->make( ["id" => self::FAKEID] )->save();
}