0

环境是 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 上找到:

4

1 回答 1

1

好吧,你没有。

因为我们知道:

  • .all总是会返回一个DataMapper::Collection
    • 它应该在不同的单元测试中进行测试
  • .to_xml将始终返回集合的 XML 表示
    • 它应该在与 HTTP get 等无关的不同单元测试中进行测试。

因此,我们可以停止在一个测试中测试所有内容并将其拆分。

您真正想要在这里测试的是控制器是否调用 Municipality.all 然后 .to_xml 调用它返回的集合"/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

上面的代码可能有点伪。

于 2010-12-08T12:02:26.720 回答