Я новичок в rspec и всей методологии TDD. Может кто-то, пожалуйста, объясните разницу между макетом и заглушкой. Когда мы их используем, и когда мы используем Factory Girl для создания объектов в тестовых случаях?
Какая разница между макетами, заглушкой и девушкой?
Ответ 1
Вы можете думать о макете (или двойном) как обманном объекте. Когда вы тестируете и должны работать с объектом, который нелегко использовать внутри вашего теста, вы можете использовать макет в качестве приближения для того, как вы ожидаете, что этот объект будет вести себя и работать вокруг него. Скрытия могут использоваться аналогичным образом, но индивидуальным методом для объекта.
Вот довольно надуманный пример использования большого количества обоих:
class Client
def connect_to_server
if Server.connect.status == 'bad'
show_an_error
else
do_something_else
end
end
def do_something_else; end
def show_an_error; end
end
context "failure" do
it "displays an error" do
bad_network_response = double("A bad response from some service", :status => 'bad')
Server.should_receive(:connect).and_return(bad_network_response)
client = Client.new
client.should_receive(:show_an_error)
client.connect_to_server
end
end
Вы можете себе представить, что использование большого количества макетов или stubbing - плохая идея; это в основном маскировка частей вашего кода в вашем тесте, но это простое решение для некоторых сложных/редких тестовых сценариев.
Factory Девушка полезна для генерации данных для тестов. Вы бы использовали фабрики в качестве рецептов для создания экземпляров для своих моделей, вам может потребоваться проверить что-то, что связано с множеством тестовых данных, и это будет ситуация, когда использование приборов не будет работать и явное создание сложных объектов может быть утомительным.
Ответ 2
Ваша первая остановка - знаменитая статья Мартина Фаулера: Mocks не являются заглушками
Edit
Mocks
и Stubs
являются двумя типами Test Doubles (терминология Мезарос). Двойные тесты обычно используются для имитации зависимостей, необходимых для системного теста (или теста класса), так что SUT/CUT можно тестировать изолированно от его зависимостей. (Caveat - точная терминология может быть довольно осязаемым предметом, например, как упоминалось Jeff here)
Из Википедии:
- Тестовые заглушки предоставляют консервированные ответы
- "mock objects может имитировать поведение сложных, реальных объектов"
Примеры
- Метод заглушки может просто возвращать постоянное значение при вызове SUT, например. для проведения конкретного тестового примера SUT.
-
*
Рамки вроде Mockito (Java) и Moq (.Net) позволяет вам строить макетные классы по интерфейсу зависимостей "на лету" с минимальным кодом и обеспечивать возможность проверки правильности взаимодействия SUT с макетом, например проверив, что SUT вызывал ложные методы правильное количество раз с правильными параметрами.
* Отказ от ответственности - я не рубиновый dev