Тесты являются потребителем вашего кода, им важен контракт, соответствие заявленных способностей, описанных в интерфейсе (сигнатуре) реальным действиям.
Тестироваться должны исключительно публичные методы, никаких приватных методов, а тем более то, что спрятано в замыканиях (привет, rewire). Почему так? Все просто, мы тестируем работоспособность модуля, а не его реализацию, тестирование приватных данных чревато серьезной завязкой на реализацию, при малейшем изменении все упадет. Такие тесты ничего не тестируют, они проверяют, что код не поменялся. Тестирование исключительно публичных методов дает серьезный маневр для рефакторинга или полного изменения реализации, достаточно оставить сигнатуру публичных методов нетронутой, а тесты проверят, что все по-прежнему работает ожидаемо.
Теперь конкретно про ваш случай.
Поскольку createPostWithTags() изпользует createPost() и addTagToPost() и зависит от результата выполнения этих функций
Когда вы пишете тест — такие рассуждения не совсем корректны. На мой взгляд, правильно рассуждать так:
Когда мы вызываем createPostWithTags у нас должно отправиться 2 post-запроса, один на создание поста, другой на добавления тега. Все, больше никаких рассуждений, тем более о внутреннем устройстве модуля.
Любой тест должен быть определен по правилу: даю данные на вход, получаю ожидаемый результат (сайд-эффект) или ожидаемые данные на выходе.
Чтобы это сделать нам приходится дублировать тест из самого createPost()
Кстати, вот еще интересный момент. Я глубоко убежден, что к написанию тестов нужно подходить совсем иначе, нежели к написанию кода продукта.
Код тестов должен быть максимально декларативным, должен содержать минимум логики, и копипаста из других тестов — это вполне ок. Цена ошибки в логике теста очень высока, потому ее надо сводить к минимуму.
Все-таки жизнь вынудила меня посмотреть отрывки из этого блокбастера.
Словами невозможно описать увиденное! Какие же чудовищные события происходят в мире из-за любительского видео без настоящих актеров, без сюжета, с бюджетом, равным паре банок пива. Если бы не весь этот крик, кроме «режиссера» никто бы эту парашу и не посмотрел.
RubaXa подписываюсь под каждым словом.
Считаю исключительным заблуждением тестирование работоспособности модулей вышеописанным способом.
Тесты являются потребителем вашего кода, им важен контракт, соответствие заявленных способностей, описанных в интерфейсе (сигнатуре) реальным действиям.
Тестироваться должны исключительно публичные методы, никаких приватных методов, а тем более то, что спрятано в замыканиях (привет, rewire). Почему так? Все просто, мы тестируем работоспособность модуля, а не его реализацию, тестирование приватных данных чревато серьезной завязкой на реализацию, при малейшем изменении все упадет. Такие тесты ничего не тестируют, они проверяют, что код не поменялся. Тестирование исключительно публичных методов дает серьезный маневр для рефакторинга или полного изменения реализации, достаточно оставить сигнатуру публичных методов нетронутой, а тесты проверят, что все по-прежнему работает ожидаемо.
Теперь конкретно про ваш случай.
Когда вы пишете тест — такие рассуждения не совсем корректны. На мой взгляд, правильно рассуждать так:
Когда мы вызываем createPostWithTags у нас должно отправиться 2 post-запроса, один на создание поста, другой на добавления тега. Все, больше никаких рассуждений, тем более о внутреннем устройстве модуля.
Любой тест должен быть определен по правилу: даю данные на вход, получаю ожидаемый результат (сайд-эффект) или ожидаемые данные на выходе.
Кстати, вот еще интересный момент. Я глубоко убежден, что к написанию тестов нужно подходить совсем иначе, нежели к написанию кода продукта.
Код тестов должен быть максимально декларативным, должен содержать минимум логики, и копипаста из других тестов — это вполне ок. Цена ошибки в логике теста очень высока, потому ее надо сводить к минимуму.
Словами невозможно описать увиденное! Какие же чудовищные события происходят в мире из-за любительского видео без настоящих актеров, без сюжета, с бюджетом, равным паре банок пива. Если бы не весь этот крик, кроме «режиссера» никто бы эту парашу и не посмотрел.