Является ли использование контейнеров Auto Mocking хорошей или плохой практикой?
Недавно я работал над проектом, который начал сильно зависеть от зависимости, и изучал идею использования контейнера AutoMocking, чтобы немного очистить мои тесты и сделать их менее хрупкими.
Я слышал аргументы против их использования пуристами TDD/BDD, утверждая, что: не сразу очевидно, какие зависимости требуются субъекту тестирования, или вы можете добавить зависимости, которые вам не нужны. Ни один из них не звучит как особенно сильный аргумент против их использования.
С моей точки зрения, введение позволит мне рефакторинг по мере необходимости, удаляя и вводя зависимости в соответствии с бизнес-требованиями, без необходимости постоянно возвращаться к тестам и вводить новые макеты / заглушки просто для того, чтобы получить код для компиляции.
AutoMocking считается хорошей / плохой практикой? Существуют ли конкретные ситуации, когда его следует или не следует использовать?
3 ответа
Как и для любого инструмента или процесса, существуют правильные и неправильные времена для их использования. Ничто не является серебряной пулей. Вы должны спросить себя "поможет ли это мне сделать мою работу?" И, в конце концов, наша работа состоит в том, чтобы обеспечить максимально возможную выгоду для бизнеса.
При разработке новых месторождений автомокинги не так полезны. Все разрабатывается с нуля, и технологии TDD/BDD с "традиционным" насмешливым способом работают отлично. Теоретически, зависимости не меняются так радикально, и когда они есть, вероятно, полезно знать, когда вы ломаете вещи.
В режиме обслуживания (или при работе с устаревшей кодовой базой) автоматическое блокирование может оказаться чрезвычайно полезным. Например, вам поручено очистить технический долг. Это, вероятно, потребует большого количества рефакторинга, и возможность изолировать ваши тесты от этих изменений - огромная экономия времени. Имейте в виду, что если в вашем коде много зависимостей, он, вероятно, нарушает SOLID и SOC, и у вас будет (или, по крайней мере, должно) быть много тестов, которые не используют все зависимости. Так что автопереключение в этом случае крайне выгодно. Конечно, есть много других примеров, где это также помогает.
Как и с любым инструментом, вы должны убедиться, что он не станет опорой. Использование автозамены, так что вы можете менять интерфейсы и apis волей-неволей, очевидно, является анти-паттерном. Но при правильном использовании я обнаружил, что это приносит огромную пользу нашим проектным командам.
Это просто требует критического мышления и применения в правильных сценариях.
Соединение ваших зависимостей вручную (и помните, что в модульных тестах ваши зависимости должны быть предназначены для очень небольшого числа объектных объектов (одного)) позволяет вам знать, когда у вас есть запах - Этот класс слишком чертов и должен быть сокращен. Тем не менее, я не думаю, что автосмешивание это плохо, но, как и любой инструмент, следует использовать с осторожностью.
Автосмешение начинает приносить пользу именно в тот момент, когда начинают пахнуть зависимости. И ответ Скимедика, и комментарий Левелниса указывают в том же направлении. Таким образом, этой практики следует избегать в целом, за исключением случаев, когда вы не можете избавиться от унаследованного / технического долга. Даже в некоторых из этих случаев я считаю, что лучше действовать так, как если бы не было автоматического издевательства, и пусть уменьшенная скорость команды является еще одной причиной, заставляющей руководство считать, что какой-то рефакторинг в порядке; или, если это неизбежное наследие, то программируйте своих собственных фальшивых строителей; дополнительная сложность теста будет лучшим маркером "опасной зоны", чем простое использование автоматического моделирования и проведение, по-видимому, простых тестов.
И, IMO, вы не должны использовать его вообще с новым кодом.