我想模拟(或存根?)一个将返回骰子结果的类方法。我希望模拟返回一个预期的值,让我们说2.但我也希望我的模拟有时返回6;例如在3:rd dice角色之后。
澄清一下,这是一个例子。用户决定角色4个骰子,我希望模拟总是为每个角色返回2 - 除了3:rd应该返回6。
代码
我正在使用PHP Laravel,我希望能够使用Mockery库。这就是我走了多远。我的代码在这个例子中有所简化。我仍然没有想出如何根据方法参数使模拟给出不同的返回值。知道怎么做吗?
class DiceHelper{
protected $diceClass;
__construct($diceClass) // I set property diceClass in constructor...
public function roleDices($nr_of_throws){
for($x=0; $x < count($nr_of_throws); $x++) {
$result = $diceClass->roleOneDice($x);
}
}
}
class diceClass
{
public function roleOneDice($dice_order){
return rand(1, 6);
}
}
TESTFILE
class diceLogicTest extends TestCase
{
/** @test */
public function role_a_dice(){
$mock = \Mockery::mock('diceClass[roleOneDice]');
$mock->shouldReceive("roleOneDice")->andReturn(2);
$theHelper = new DiceHelper($mock);
$result = $theHelper->roleDices(2);
$this->assertEquals(4,$result ); // Returns the expected 4.
}
}
改进 如果有一种方法可以在返回值之前计算它被调用的次数,那将是很好的。这样我的DiceHelper方法RoleDices就不必发送参数$ x(当前骰子抛出顺序)。我想这个方法不应该用来使测试工作。
答案 0 :(得分:0)
这个PHPUnit解决方案非常完美。
$mock= $this->getMock('\diceClass');
$mock->method('roleOneDice')->will( $this->onConsecutiveCalls(2,2,3));
$theHelper = new DiceHelper($mock);
$result = $theHelper->roleDices(3);
$this->assertEquals(7, $result);
使用onConsecutiveCalls时,每次调用mock时都会返回一个期望值。第一个它将返回2,第三个3.如果你更多地调用模拟3次,你需要更多的数字 - 我想。