模拟Laravel Facade,从Facade本身调用方法

时间:2018-12-25 22:16:32

标签: laravel unit-testing phpunit mockery

我目前正在编写有关Trait的单元测试。该特性包括一个称为registryPersist()的方法,该方法后来又调用了一个名为Registry :: persist()的Facade方法。顾名思义,此方法将注册表值保存到数据库,然后调用Registry :: set()以便将注册表设置为本地范围。这是一个相当简单的过程。

我尝试遵循Laravel文档的建议,并使用以下代码模拟Registry :: persist()方法:

Registry::shouldReceive('persist')->with('test', 'ok', 'model.users')

但是考虑到 persist 也调用 set ,我得到了 BadMethodCallException 异常,因为没有模拟 set 。 (收到RegistryAccessControl :: set(),但未指定期望值

官方的嘲讽文档建议创建一个模拟实例,但是无论如何这都不起作用,因为当我实际尝试调用Trait方法时,不会对外观进行模拟。

$user = factory(User::class)->create();
$user->registrySet('test', 'ok');

特质方法:

public function registryPersist(string $name, $value): void
{
    Registry::persist(
        $name,
        $value,
        $this->getNamespace()
    );
}

有什么方法可以有效地测试这种方法?

此外,考虑到 registrySet()仅将参数转发给Facade,您认为尝试编写的测试是一个好主意吗?

谢谢。

0 个答案:

没有答案