我想模拟(或stub?)一种将返回骰子结果的类方法。我希望模拟返回预期价值,说2。但是我也希望我的模拟有时会返回6;例如,3:rd骰子角色之后。
澄清,这就是一个例子。用户决定着角色4 dices,我希望模拟始终返回每个角色 - 除了应该返回6的3:rd。
代码
我正在使用PHP Laravel,希望使用嘲弄库。这就是我走了多远。对于此示例,我的代码有些简化。我仍然没有弄清楚如何根据方法参数进行模拟给出不同的返回价值。有什么想法如何做?
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(当前的骰子投掷订单)。我猜该方法不应构建以使测试起作用。
此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,每次调用模拟时都会返回一个期望值。第一个它将返回2,第三个3.如果您调用模拟次数,则需要3次,您需要更多的数字 - 我认为。