嘲弄重载类缺少方法

Posted

技术标签:

【中文标题】嘲弄重载类缺少方法【英文标题】:mockery overload class missing methods 【发布时间】:2017-06-28 17:33:48 【问题描述】:

在使用 Mockery 时需要一些帮助 - 我想重载一个类,该类是在方法中使用 new HelperUtil() 创建的。

使用 Mockery overload 我可以做到这一点,但它给我留下了一个空壳类。然后我似乎必须创建所有被调用的方法。有没有办法创建一个重载的完整模拟,然后只更改一个方法?

    $mock = \Mockery::mock('overload:'.HelperUtil::class);
    $mock->shouldReceive('content')->andReturnUsing(function() 
        return 'different content';
    );

谢谢

编辑: 我想我想做:

    $mock = \Mockery::mock('overload:'.HelperUtil::class)->shouldDeferMissing();
    $mock->shouldReceive('content')->andReturnUsing(function() 
        return 'different content';
    );

但这仍然不起作用 =(

【问题讨论】:

【参考方案1】:

在 GitHub 上有一个关于它的 interesting discussion

shouldIgnoreMissingshouldDeferMissing(以及其他此类标志 现在和未来)确实可以工作,但不是在模拟上,而是在实例上 模拟。

听起来令人困惑,但这是因为内部结构。

当您执行 m::mock('overload:Foo'); 嘲讽时,会创建一个新的 基于Mock.php“模板”的名为Foo的类。还有那个模板 默认情况下,_mockery_ignoreMissing 标志设置为 false。

一旦模拟方法结束,它会创建一个重载的Foo 对象并将其返回给我们。重载的Foo 类也是 可用于实例化新的Foo 对象。

调用 $m->shouldIgnoreMissing() 在 mock 方法返回的对象。

调用new Foo() 会创建Foo 对象的一个​​新实例,该对象具有 Mock.php 模板对于 _mockery_ignoreMissing 的默认值为 false。

如果您希望在新实例上将标志设置为 true,则需要调用 shouldIgnoreMissing() 在该实例上,而不是在 $m 上。

如我所见,功能“should ignore missing on instance mocks”已经完成,所以你能做的最好的就是

$mock = \Mockery::mock('overload:'.HelperUtil::class)->shouldIgnoreMissing();

我还没有看到 shouldDeferMissingoverload 的处理。

当然,作为一种解决方法,您可以考虑创建一个模拟并注入它。

【讨论】:

以上是关于嘲弄重载类缺少方法的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 的嘲弄不会模拟方法

嘲弄:模拟对象上不存在方法

ES6类开玩笑嘲弄

未找到“嘲弄”类

具有不止一种方法的嘲弄学说/存储库

嘲弄“应该接收”但方法不存在