Laravel嘲笑:与返回逻辑模拟



我想模拟(或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次,您需要更多的数字 - 我认为。

最新更新