Laravel5、PHPUnit 和 Date Mutators:不能在数据提供者中使用 mutator

Posted

技术标签:

【中文标题】Laravel5、PHPUnit 和 Date Mutators:不能在数据提供者中使用 mutator【英文标题】:Laravel5, PHPUnit and Date Mutators: can't use mutator in data provider 【发布时间】: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() 方法提供输入模型?

【问题讨论】:

您有什么理由不使用工厂来使用伪造方法创建带有伪造数据的模型实例? 我需要控制模型中的数据,以便提供重要的输入数据。这有什么关系? 【参考方案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]
    ];

【讨论】:

以上是关于Laravel5、PHPUnit 和 Date Mutators:不能在数据提供者中使用 mutator的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.5 中运行 phpunit

无法测试事件是不是具有 Laravel 5 和 PHPUnit 的属性

Laravel 5.2 PHPUnit JSON Api 请求正文未设置

Laravel 5.1 使用 JSON 的 API 的 PHPUnit 测试

phpunit 测试资源 laravel 5.5 返回集合而不是 json

Laravel 5 PHPUnit - 从路由返回了无效的 JSON