Laravel PHPunit Dataprovider错误'指定的数据提供程序无效'

k7fdbhmy  于 2023-03-31  发布在  PHP
关注(0)|答案(2)|浏览(146)

我正在使用dataprovider,数据从数据库中获取:

public function logoProvider()
{

    $result = Event::inRandomOrder()->select('id')->whereNotNull('logo')->first();

    return [
        [$result->id, '<path>'],
        ['', ''],
    ];
}

但出现以下错误:

The data provider specified for Tests\Unit\****Test::testLogo is invalid.
Error: Call to a member function connection() on null

有办法吗?

g0czyy6m

g0czyy6m1#

感谢他们的问题。在我的拙见和所有应有的尊重真的他们!,错误消息张贴:
错误:在null上调用成员函数connection()
在我看来,这可能是由以下调用链中的隐藏数据库访问层引起的:

Event::inRandomOrder()->select('id')->whereNotNull('logo')->first()

在我看来,当调用数据提供程序时,好像隐藏的数据库访问层没有工作(或没有准备好)。
有办法吗?
根据我对数据提供者摘录上下文中的错误消息的印象,我认为可能的解决方案是在调用链之前设置(配置)数据库访问层。
在我看来,配置是整个 * 测试夹具 * 的一部分。

当看到这个错误消息并且配置是fixture的一部分时,解决方案是在执行数据提供者时设置fixture。
根据 * Dataprovider can [sic] get connection from setUp * 标准,setUpsetUpBeforeClass钩子不适用于数据提供者方法。
因此,一个额外的解决方案可能是使用 bootstrap-file Phpunit设置。在运行任何测试用例之前进行引导,并且绑定到全局静态状态的数据提供程序将发现它已配置。

我会考虑什么作为替代解决方案?
根据我自己的经验-他们的里程可能会有所不同-在我看来,这似乎是最直接的,并且通常足以决定在没有数据库连接的情况下进行测试,首先是在Phpunit中使用数据提供程序。
当具有用于测试的较大数据集时,数据提供者可以容易地从作为测试套件的一部分的夹具文件获得,并且文件系统通常至少可用于在运行测试套件时的读取访问。

然后,任何数据提供者都只返回普通的测试参数,而不使用其他昂贵的数据层和设置。
Phpunit的最新版本还打乱了提供的数据的顺序,就像测试运行器对测试方法执行顺序所做的那样。
另请参阅此answer to "Mocking PDO with phpunit"中的2020年5月编辑。
这并不意味着没有需要数据库适配器和网络服务测试数据库的特定测试(通常称为集成测试或数据库测试)。
需要使用数据库适配器运行的测试然后在它自己的测试套件中完成,该测试套件可以更专门地运行以测试与数据库适配器的集成以及与数据库系统的连接。
之所以这样划分,是因为使用数据库连接的测试通常要昂贵得多-在多个方面:这些测试通常包括配置/设置、编写/维护测试和数据,最后但并非最不重要的是运行测试-使得它们可以容易地成为快速反馈回路中的阻塞器,使得它们仅执行它们,特别是专门针对不同的特定开发目标(例如,每晚)。

oiopk7p5

oiopk7p52#

我也遇到了同样的问题,并设法通过在数据提供程序中显式调用parent::setUp();来解决这个问题。
所以在你的情况下,

public function logoProvider()
{
    parent::setUp();

    $result = Event::inRandomOrder()->select('id')->whereNotNull('logo')->first();

    return [
        [$result->id, '<path>'],
        ['', ''],
    ];
}

相关问题