工厂助手在PHPUnit设置方法中不起作用

时间:2018-11-09 04:57:34

标签: php laravel phpunit

编写一些单元测试,我想在完成类中的测试之前创建一个对象。因此,我设置了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()唯一与我不同的地方是它是一个静态方法,但是我不知道为什么这样做会阻止工厂类工作。

1 个答案:

答案 0 :(得分:0)

Laravel在setUp()类的TestCase方法中做了很多设置。在此之前调用setUpBeforeClass()方法,这就是为什么尚未加载工厂的原因。

Laravel的TestCasesetup方法(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();
}