【问题标题】:Factory helper not working within PHPUnit setup method工厂助手在 PHPUnit 设置方法中不起作用
【发布时间】:2019-04-12 16:34:47
【问题描述】:

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

【问题讨论】:

    标签: php laravel phpunit


    【解决方案1】:

    Laravel 在 TestCase 类的 setUp() 方法中做了很多设置。在此之前调用了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();
    }
    

    【讨论】:

    • 但是这个方法在每次测试之前运行。在每次测试之前都必须创建和插入新记录并在每次测试后删除它们似乎是一种浪费。
    • 我明白你在说什么,但这就是与框架结合时得到的结果.. Laravel 在每次测试之前就已经这样做了.. 你想使用基于 Laravel 的工厂,所以你需要 Laravel当它设置和运行时,那是在调用 TestCase setUp 夹具之后..
    • 顺便说一句,您总是应该在每次测试开始时重置状态。基于先前测试状态的测试在单元测试中是不可以的。这就是为什么 Laravel 每次测试都会重置自己。
    • 我所做的只是在我实际测试的记录上插入一些外键需要的记录。就像在我使用的示例中一样,我需要在创建用户之前设置一个位置。我希望我会接受这个答案,似乎是不必要的数据库访问,经过数十次测试。
    • 为什么这在 dataProvider 中也不起作用?有办法解决吗?
    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多