我具有类似的功能:
// $value could be an array or SomeClass type
public function foo($key, $value)
{
// some code
if ($value instanceof SomeClass) {
$value = $this->bar($value);
}
// some code
}
protected function bar(SomeClass $value)
{
// do stuff
}
现在在我的测试中,我有这样的东西:
{
$suppliedValue = [];
$mock = ... // create mock
$mock->shouldReceive('foo')->withArgs(
// first arg should be an int or string
// second arg should be an array or SomeClass object
);
if (typeOf($suppliedValue) === 'array') {
$mock->shouldNotReceive('bar');
} else {
$mock->shouldReceive('bar');
}
$mock->aFunctionThatCallsFoo($suppliedValue);
}
无论它似乎什么都不起作用,无论向foo()
提供什么值,它都不会触发shouldReceive()
上的shouldNotReceive()
/ bar()
。
我在这里想念什么?我感觉好像是在误解有关模拟的基本知识。
答案 0 :(得分:0)
我没有找到通过模拟解决此问题的方法,但我改用了Spy。
$spy = Mockery::spy(TheClass::class)
->makePartial()
->shouldAllowMockingProtectedMethods();
$spy->aFunctionThatCallsFoo($suppliedValue);
$spy->shouldHaveReceived('foo')
->withArgs(/* args */);
$spy->shouldHaveReceived('bar');
我最终创建了2个测试函数,而不是将if else
用于$suppliedValue
类型,其中另一个调用了shouldNotHaveReceived()