嘲弄重载类缺少方法
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
shouldIgnoreMissing
和shouldDeferMissing
(以及其他此类标志 现在和未来)确实可以工作,但不是在模拟上,而是在实例上 模拟。听起来令人困惑,但这是因为内部结构。
当您执行
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();
我还没有看到 shouldDeferMissing
对 overload
的处理。
当然,作为一种解决方法,您可以考虑创建一个模拟并注入它。
【讨论】:
以上是关于嘲弄重载类缺少方法的主要内容,如果未能解决你的问题,请参考以下文章