phpspec - укажите, что аргументы должны передаваться фиктивному объекту

Я новичок в PHPSpec и BDD/TDD в целом.

Учитывая следующий код:

interface Checker
{
    public function execute(array $args = array());
}

class Check
{
    public $checker;

    public $params = array();

    public function doCheck()
    {
    }
}

Я хотел бы указать, что класс Check должен передавать свои аргументы в Checker, но не знаю, как это сделать.

Моя спецификация:

class CheckSpec extends ObjectBehavior
{    
    function it_should_pass_params_to_checker_on_execute(\Checker $checker)
    {
        $checker->execute()->willReturn(true);
        $this->checker = $checker;
        $this->params = array(1,2);
        $this->doCheck();
        $checker->execute(array(1,2))->shouldHaveBeenCalled();
    }
}

Когда я запускаю спецификацию, перед реализацией в классе Checker, я получаю:

9  - it should pass params to checker on execute
  no calls been made that match:
    Double\Checker\P1->execute(exact([1, 2]))
  but expected at least one.

Как только я реализую:

class Check
{
    public $checker;

    public $params = array();

    public function doCheck()
    {
        $this->checker->execute($this->params);
    }
}

Я получил:

9  - it should pass params to checker on execute
  method call:
    - execute([1, 2])
  on Double\Checker\P1 was not expected, expected calls were:
    - execute()

Что дает? Насколько я могу судить, я реализовал, как указано.


person cesarv    schedule 10.04.2015    source источник


Ответы (1)


Я понял:

class CheckSpec extends ObjectBehavior
{    
    function it_should_pass_params_to_checker_on_execute(\Checker $checker)
    {
        // I should've created my mock with the expected parameters
        $checker->execute(array(1,2))->willReturn(true);
        // Like so ------>^^^^^^^^^^^      
        $this->checker = $checker;
        $this->params = array(1,2);
        $this->doCheck();
        $checker->execute(array(1,2))->shouldHaveBeenCalled();
    }
}
person cesarv    schedule 10.04.2015