Какая разница между издевательством, заглушкой и заводской девушкой? - PullRequest
31 голосов
/ 08 сентября 2011

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

Ответы [ 2 ]

16 голосов
/ 08 сентября 2011

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

Вот довольно надуманный пример использования обоих:

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

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

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

16 голосов
/ 08 сентября 2011

Ваша первая остановка - знаменитая статья Мартина Фаулера: Насмешки - это не окурки

Редактировать

Mocks и Stubs - это дватипов Test Doubles (терминология Мезароса).Тестовые дубликаты обычно используются для имитации зависимостей, необходимых для тестируемой системы (или тестируемого класса), так что SUT / CUT может тестироваться изолированно от своих зависимостей.(Предостережение - точная терминология может быть довольно обидчивой темой, например, как упомянуто Джеффом здесь )

Из википедии:

Примеры

  • AМетод-заглушка может просто возвращать постоянное значение при вызове SUT, например, для проведения конкретного теста SUT.
  • * Фреймворки, такие как Mockito (Java) и Moq (.Net), позволяют создавать на лету классы-макеты на основе интерфейса зависимости с минимумомкод и предоставить возможность проверить, правильно ли SUT взаимодействовал с макетом, например, проверяя, что SUT вызывал методы макета правильное число раз с правильными параметрами.

* Отказ от ответственности - я не рубиновый разработчик

...