Laravel Mockery:使用返回逻辑进行模拟

时间:2016-12-09 17:31:26

标签: php laravel unit-testing mocking mockery

我想模拟(或存根?)一个将返回骰子结果的类方法。我希望模拟返回一个预期的值,让我们说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(当前骰子抛出顺序)。我想这个方法不应该用来使测试工作。

1 个答案:

答案 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次,你需要更多的数字 - 我想。