Тестирование с помощью phpspec - метод пересмешки из текущего класса

Я изучаю phpspec и не могу понять, почему тест не проходит.

Вот моя функция:

public function isTaskForChange($task)
{
    $supportedTasks = array_keys($this->availableTasks()); 
    $isTaskForChange = in_array($task, $supportedTasks);

    return $isTaskForChange;
}

А вот тест в phpspec:

public function it_validates_if_task_should_be_changed()
{
    $this->isTaskForChange('write')->shouldReturn(true);
}

Однако, когда я запускаю этот код, я возвращаюсь:

warning: array_keys() expects parameter 1 to be array, null given

Мой вопрос: как смоделировать $this->availableTasks() для возврата значений?

1 ответ

То, что вы пытаетесь сделать, называется частичной насмешкой.

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

Причина этого заключается в том, что необходимость частичной насмешки, скорее всего, связана с проблемой проектирования (в данном случае нарушение принципа единой ответственности). Phpspec и пророчество - инструменты с высокой степенью самоуверенности. Они предназначены для людей, которые хотят получить правильный дизайн. Поэтому некоторые вещи просто невозможны.

Вы можете либо исправить свой дизайн, либо использовать другую среду для насмешек, чтобы выполнить то, что вам нужно (например, издевательство).

Вы не должны издеваться над методом availableTasks(), но настройте ваши объекты так, чтобы они возвращали то, что вы ожидаете. Издевайтесь или заглушайте сотрудников.

PS Стоит прочитать Мои десять самых любимых ограничений PhpSpec

Другие вопросы по тегам