RSpec & DataMapper: как правильно заглушить метод поиска - PullRequest
0 голосов
/ 08 декабря 2010

Средой является Синатра, Нокогири, 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:

1 Ответ

1 голос
/ 08 декабря 2010

Ну, а вы нет.

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

  • .all всегда будет возвращать DataMapper::Collection
    • Это должно быть проверено в другом устройстве испытании
  • .to_xml всегда будет возвращать XML-представление коллекции
    • Он должен быть протестирован в модуле unit test, который не имеет никакого отношения к HTTP get и т. Д.

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

Что вы действительно хотите проверить здесь, так это если контроллер вызывает Municipality.all И затем .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

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

...