2016-12-09 2 views
0

私は、サイコロの結果を返すクラスメソッドをモック(またはスタブ)したいと思っています。私はモックが期待値を返すようにしたい、2と言うことができる。しかし、私はまた、私のモックが時々6を返すことを望む。たとえば3:R Dダイスロールの後のように。Laravel Mockery:返り論理のモック

明確にするために、これは一例です。ユーザーが役割4サイコロに決定した、と私はモックは常にすべての役割のために2を返すようにしたい - 3を除い:私はPHPを使用しています6.

コード

を返す必要があり、RD 1 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

この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回目です。モックを3回以上呼び出すと、さらに数字が必要になると思います。

関連する問題