Как глубоко издеваться над классом, который поддерживает методы цепочки

Я пытаюсь выполнить модульное тестирование контроллера, в котором у меня есть $this->library->client->changeLog->create(), и мне интересно, нужно ли мне издеваться над каждым из этих свойств или я могу просто каким-то образом глубоко имитировать $this->library, поэтому мне не нужно иметь длинную цепочку объектов. mocked и должны также беспокоиться о параметрах их конструктора. Я пытаюсь издеваться над цепью прямо сейчас, и это очень уродливо и не очень хорошо работает.

Я также пробовал $this->library->shouldReceive('client->changeLog->create')->once()->andReturn(true);, но это приводит к «попытке получить свойство не-объекта.

Есть ли простой способ проверить вывод метода, который имеет несколько свойств?


person Webnet    schedule 03.02.2014    source источник


Ответы (1)


Теоретически возвращаемый результат каждого измененного вызова метода будет возвращать $this, поэтому вам нужно будет создать фиктивный объект и возвращать его при каждом вызове метода. Вот пример того, как это сделать при переполнении стека.

Фиктивные объекты, поддерживающие методы цепочки

Подобный код часто можно рассматривать как запах кода, о котором вы можете узнать больше здесь, в этом посте о переполнении стека.

Цепочки сообщений против посредника

Поскольку вы тестируете контроллер и я угадываю действие внутри этого контроллера, вы, возможно, могли бы проверить вывод действия контроллера. Это означает, что весь код будет выполняться, и вы будете проверять результат действия контроллера.

Затем вы могли бы потенциально реорганизовать код, чтобы у вас не было вызова связанного метода, что упростило бы имитацию и тестирование.

person Jeremy Quinton    schedule 03.02.2014