2016-12-09 3 views
0

Я хочу высмеять (или заглушить?) Метод класса, который вернет результат в кости. Я хочу, чтобы макет возвращал ожидаемое значение, скажем 2. Но я также хочу, чтобы мой макет возвращал 6; например, после роли 3: rd.Laravel Mockery: mock with return logic

Чтобы уточнить, это пример. Пользователь решает роль 4 игральных костей, и я хочу, чтобы макет всегда возвращает 2 для каждой роли - за исключением 3: й тот, который должен возвращать 6.

Code

Я использую 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

Это решение 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 раз, вам нужно больше чисел - я думаю.

Смежные вопросы