RSpec & DataMapper: как правильно заглушить метод поиска

Среда — Sinatra, Nokogiri, RSpec, FactoryGirl и DataMapper.

Проблема связана с сериализатором DataMapper. Я не знаю, как заглушить соответствующим образом с ним.

Проблемный код:

specify 'should return an xml array of all municipalities' do
    municipalities = []
    10.times { |n| municipalities << Factory.build(:municipality, :code => "Municipality no #{n}") }
    Municipality.stub!(:all).and_return(municipalities)
    get "/municipalities.xml"
 #  ^------- KABOOM!
 #  [.. rest of code clipped out ..]
 end

Код, который вызывает get, практически эквивалентен:

 Municipality.all.to_xml

Проблема в том, что тип результирующего набора — DataMapper::Collection, который имеет метод #to_xml.

Моя заглушка явно не работает, потому что я использую Array заглушек вместо DataMapper::Collection.

Мой вопрос:

Как мне создать коллекцию экземпляров (с помощью FactoryGirl), которые относятся к типу DataMapper::Collection и имеют метод #to_xml, предоставленный сериализатором DataMapper?

Код также доступен на Github:


person Petrus Repo    schedule 08.12.2010    source источник


Ответы (1)


Ну, вы не знаете.

Потому что мы знаем, что:

  • .all will always return a DataMapper::Collection
    • It should be tested in different unit test
  • .to_xml will always return a XML representation of collection
    • It should be tested in diffenent unit test that has nothing to do with HTTP get etc.

Таким образом, мы можем перестать тестировать все в одном тесте и разделить его.

Что вы действительно хотите проверить здесь, так это то, что контроллер вызывает Муниципалитет. все И затем .to_xml для коллекции, которую он возвращает, КОГДА он вызывается с GET "/municipalities.xml"

specify 'should return an xml array of all municipalities' do
  collection = mock(DataMapper::Collection (or anything, its not really interesting here))
  collection.should_receive(:to_xml).and_return(xml_if_needed_for_view)

  Municipality.should_receive(:all).and_return(collection)

  get "/municipalities.xml"
end

Код выше может быть несколько псевдо.

person matti    schedule 08.12.2010
comment
В порядке! Спасибо за расширение моего кругозора! :) - person Petrus Repo; 13.12.2010