【问题标题】:RSpec & DataMapper: How to stub the finder method correctlyRSpec & DataMapper:如何正确地存根 finder 方法
【发布时间】:2010-12-08 11:32:49
【问题描述】:

环境是 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

我的问题是:

我应该如何创建类型为DataMapper::Collection 并具有DataMapper 的序列化程序提供的#to_xml 方法的实例集合(使用FactoryGirl)?

代码也可以在 Github 上找到:

【问题讨论】:

    标签: xml-serialization rspec datamapper factory-bot stub


    【解决方案1】:

    好吧,你没有。

    因为我们知道:

    • .all 将始终返回 DataMapper::Collection
      • 应该在不同的unit测试中测试
    • .to_xml 将始终返回集合的 XML 表示
      • 应该在与 HTTP get 等无关的不同 unit 测试中进行测试。

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

    您真正想要在这里测试的是控制器是否调用了 Municipality.all 然后 .to_xml 调用了它返回的集合,当它被调用时使用 "/municipalities.xml" 的 GET 调用

    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
    

    上面的代码可能有点伪。

    【讨论】:

    • 好的!谢谢你开阔了我的视野! :)
    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多