Используя rspec, не понимаете разницу между макетом и заглушкой? - PullRequest
2 голосов
/ 19 мая 2011

В чем разница между макетом и заглушкой, они оба кажутся мне очень похожими?

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

Ответы [ 3 ]

7 голосов
/ 19 мая 2011

Это ссылка в большинстве статей, довольно общее и понятное объяснение:

http://martinfowler.com/articles/mocksArentStubs.html

В двух словах:

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

И

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

1 голос
/ 15 февраля 2013

Статья и вопрос задаются в разных контекстах. Относительно сферы Rspec авторы Книги Rspec пишут в гл. 14.1:

"Чтобы создать двойник, просто используйте метод double(), например:

thingamajig_double = double('thing-a-ma-jig')

... Существуют также методы stub() и mock(), , которые производят объект такого же типа :

stub_thingamajig = stub('thing-a-ma-jig')
mock_thingamajig = mock('thing-a-ma-jig')

Мы можем использовать их, чтобы сделать спецификацию более понятной, когда это уместно. "(Выделено мной)

Авторы также включают фрагмент кода позже в гл. 14.3 -

describe Statement do
  it "logs a message on generate()" do
    customer = stub('customer')
    customer.stub(:name).and_return('Aslak')
    logger   = mock('logger')
    statement = Statmement.new(customer, logger)

    logger.should_receive(:log).with(/Statement generated for Aslak/)

    statement.generate
  end
end

и затем напишите «Используя метод mock() для генерации двойного регистратора и метод stub() для генерации двойного клиента, мы помогаем выразить, что эти объекты играют разные роли в примере. " (выделение мое)

Эти фрагменты кода и пояснения заставляют меня полагать, что хотя концептуальные линии, проведенные г-ном Фаулером в его статье, являются хорошими для рисования, нет функциональной разницы между stub() или mock() (или double(), в этом отношении) в Rspec. Может быть, это не так, я не проверял документацию.

0 голосов
/ 05 июня 2013
stub:

A fake object that returns a pre-determined value for a method call.
Actual object is not called.


Stubs and mocks often used interchangeably.
Mean two different things.
But people generally refer to "Mock Object Frameworks"

Product.stub(:find_by_title).with('orange').and_return(Product.new(:title=>"orange", :price=>6.23))

Mocks:

Just like Stubs, but with an expectation to be (or not to be) called.

Test will fail if the mock is (or isn't) called.

Used in the same way as stubs,

Product.should_receive(:find_by_title).with('orange').exactly(2).and_return(Product.new(:title=>"orange", :price=>6.23))

To know more about mock and stub please refer this article, 
http://www.ibm.com/developerworks/web/library/wa-mockrails/index.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...