Когда использовать частичные макеты? - PullRequest
7 голосов
/ 26 сентября 2008

Я начинаю привыкать к идее подделок, заглушек, издевательств и динамических издевательств. Но я все еще немного сомневаюсь в своем понимании того, когда использовать частичные насмешки.

Может показаться, что если вы планируете издеваться над сервисом и хотите прибегнуть к частичному издевательству, то это признак плохого дизайна. Является ли частичная имитация в основном для получения устаревшего кода при тестировании?

С другой стороны, скажем, я тестирую класс, у которого есть метод Reset (). Если я уже подтвердил в отдельном тесте, что метод Reset () работает, и у меня есть некоторые функциональные возможности класса, которые должны заканчиваться вызовом этого метода, является ли плохой дизайн теста для частичной проверки объекта и запуска проверяет частичное макетирование, определяя Ожидание для метода Reset ().

В настоящее время у меня есть несколько тестов, настроенных таким образом, это может вызвать у меня проблемы позже?

Ответы [ 4 ]

2 голосов
/ 18 декабря 2008

В вашем примере кажется, что метод Reset - это деталь реализации, и при использовании частичного макета вы рискуете связать свой тест с реализацией класса. Это сделает ваш тест более хрупким, чем должен быть.

Я также думаю, что это делает тесты более запутанными из-за наличия объекта, имеющего некоторые методы с реальными реализациями и некоторые с реализациями-заглушками. Это еще одна вещь, которую нужно помнить, когда вы вернетесь к тесту позже.

Можете ли вы (а) использовать основанное на состоянии тестирование, чтобы утверждать, что состояние объекта соответствует ожидаемому после того, как настоящий Reset метод был вызван изнутри; или (b) использовать основанное на взаимодействии тестирование для проверки того, что соответствующие вызовы взаимодействующих объектов были сделаны в результате реального метода Reset?

Вы можете найти Test Smell: Mocking конкретные классы из mockobjects.com полезными.

2 голосов
/ 26 сентября 2008

Хороший дизайн, имхо. Что происходит, когда кто-то приходит за вами и меняет ваш метод, удаляя вызов Reset? (кстати, почему в ваших объектах так много состояния?) Вы, возможно, никогда не узнаете, что они облажались, пока не попали в производство. Насмехаясь над этим и утверждая этот вызов метода, вы можете быть уверены, что никто не будет мешать, поддерживая ваш код.

1 голос
/ 26 сентября 2008

Можно утверждать, что все макеты являются «частичными» в том смысле, что они не полностью реализуют интерфейс. Поскольку вы пытаетесь протестировать очень сфокусированный фрагмент функциональности, вам следует высмеивать только те аспекты поддержки классов, которые необходимы для реализации тестируемого фрагмента функциональности.

Это позволит отделить ваш тест от других тестов, и это хорошо.

1 голос
/ 26 сентября 2008

Мое понимание частичной насмешки заключалось в том, что это было для насмешки над абстрактными классами, при этом только насмешивались абстрактные методы, а существующие конкретные методы оставались такими, как есть?

...