我是 rspec 的新手,嘲笑和存根。我慢慢地开始欣赏并围绕孤立测试和模拟/存根的概念。我有一个基本问题,我认为通过代码更容易解释:
class NewsItem < ActiveRecord::Base
...
scope :ordered, order("created_at DESC")
...
end
现在在我的模型测试中,我希望测试返回 news_items 有序列表的行为。使用 FactoryGirl DB-touching 测试,我实现了如下:
# TODO use mocking and stubbing here
it "should have an ordered method to retrieve news items in the descending order" do
news_item_x = create(:news_item, created_at: DateTime.new(2012,01,01))
news_item_y= create(:news_item, created_at: DateTime.new(2011,01,01))
news_item_z= create(:news_item, created_at: DateTime.new(2012,03,01))
# .all added to avoid comparison failure between groups of NewsItem objects an ActiveRel group.
expect(NewsItem.ordered.all).to eql([news_item_z, news_item_x, news_item_y])
end
我不知道如何将上述测试转换为模拟和存根。这是第一次尝试,但显然我在这里误解了一些核心概念。
xit "should have an ordered method to retrieve news items in the descending order" do
news_item_x = mock(NewsItem, created_at: DateTime.new(2012,01,01))
news_item_y = mock(NewsItem, created_at: DateTime.new(2011,01,01))
news_item_z = mock(NewsItem, created_at: DateTime.new(2012,03,01))
NewsItem.should_receive(:ordered).and_return([news_item_z, news_item_x, news_item_y])
# NewsItem.should_receive(:ordered).ordered # not working.
# this is pointless as it's not checking the order of anything, just the call.
NewsItem.ordered
end
在这种测试中模拟/存根是否合适?
任何建议将不胜感激。
判决:
我从@arieljuod 和@zetetic 那里得到了一些很好的答案。对于我最初的问题,在这里嘲笑和存根是否合适?正如@zetetic 指出的那样,答案似乎是否定的。
另一方面,@arieljuod 提供了一种非常好的方法来实际测试我的代码片段(不一定通过模拟和存根)。这两个都是有效的答案。