Как наилучшим образом протестировать сервис, чьи эффекты перезаписываются из-за заглушенной зависимости - PullRequest
0 голосов
/ 19 сентября 2019

Во-первых, мой пример на php, но это не вопрос php, а просто вопрос о тестировании лучших практик

Итак, у меня есть эта функция, которую я хотел бы протестировать

public function createNewTodo(CreateTodoQuery $query): TodoResponseObject
{        
    $new_todo = TodoFactory::createNew($query->getUserId(), $query->getTitle())
        ->withDescription($query->getDescription());
    $new_todo = $this->todo_repository->save($new_todo);

    return TodoResponseObject::fromDomain($new_todo);
}

Для того, чтобы протестировать эту функцию, мне нужно будет заглушить свою зависимость (todo_repository).Я хочу провести один тест, который подтверждает, что я получаю экземпляр TodoResponseObject.Достаточно просто

Теперь важный момент: я хочу заявить, что объект todo создается с параметрами, установленными в запросе.Поскольку я собираюсь заглушить todo_repository, на самом деле я не могу этого сделать, так как мой тест просто подтвердит значения того, что я настроил для возврата моей заглушки.Я мог бы сделать что-то вроде соглашения типа assertCalledWith, но затем я вхожу в анти-шаблон тестирования, который называется «тестирование реализации, а не функциональности».

Итак, как лучше всего получитьвокруг этого, и что будет лучшим способом проверить это?

1 Ответ

0 голосов
/ 19 сентября 2019

См. Сэнди Мец, Магические приемы тестирования

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

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

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

public function createTodo(CreateTodoQuery $query) {
    return TodoFactory::createNew($query->getUserId(), $query->getTitle())
    ->withDescription($query->getDescription());
}

Изменение дизайна вашей реализации таким образом, чтобы оно лучше подходило для вашего тестирования, составляет normal in .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...