【问题标题】:Laravel5, PHPUnit and Date Mutators: can't use mutator in data providerLaravel5、PHPUnit 和 Date Mutators:不能在数据提供者中使用 mutator
【发布时间】:2017-10-31 03:09:00
【问题描述】:

我刚刚注意到我们不能在测试数据提供程序中使用日期修改器。示例

class FooTest extends TestCase {

    /**
     * @dataProvider baz
     */
    public function testBar($baz) {
        $this->assertTrue(true);
    }

    public function baz() {
        $model = new Foo(['someDate' => \Carbon\Carbon::now());
        return [
            [$model]
        ];
    }
}

鉴于你的模型是这样的

class Foo extends Model {

    public function getDates() {
        return ['someDate'];
    }

}

该测试将产生以下错误

PHP Fatal error:  Call to a member function connection() on null in /var/www/agents/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php on line 3224

那是因为在 eloquent 模型中我们有

protected function getDateFormat()
{
    return $this->dateFormat ?: $this->getConnection()->getQueryGrammar()->getDateFormat();
}

正在尝试访问未在测试数据提供程序中建立的连接。

那么,我们应该如何为testBar() 方法提供输入模型?

【问题讨论】:

  • 您有什么理由不使用工厂来使用伪造方法创建带有伪造数据的模型实例?
  • 我需要控制模型中的数据,以便提供重要的输入数据。这有什么关系?

标签: php laravel laravel-5 phpunit


【解决方案1】:

你必须在你的 dataProvider 中运行它。这是因为它在运行 CreateApplication 代码之前获取了 dataProvider 数据。这也可以生成The data provider specified for x is invalid. PHPStorm 只有在运行单个测试时才会显示No tests executed!

public function baz() {
    $this->refreshApplication(); 
    $model = new Foo(['someDate' => \Carbon\Carbon::now());
    return [
        [$model]
    ];
}

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 2021-01-21
    • 2017-08-20
    • 2011-10-21
    • 2018-05-17
    • 2013-02-14
    • 2018-02-02
    • 2012-05-24
    相关资源
    最近更新 更多