2008-09-26 2 views
7

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

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

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

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

ответ

1

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

2

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

+0

Воля, я не совсем понимаю, что вы пытаетесь сказать. Я спрашиваю, когда я должен использовать Partial Mocks, а не то, как работают макеты. – 2008-09-26 14:27:11

1

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

Это позволит вашему тесту быть отделенным от других тестов, что приятно.

2

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

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

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

Возможно, вы найдете Test Smell: Mocking concrete classes с сайта mockobjects.com.