私はrspec、モック、スタブの初心者です。私はゆっくりと、分離されたテストと一般的なモック/スタブの概念を理解し、理解し始めています。基本的な質問がありますが、コードで簡単に説明できると思います:
class NewsItem < ActiveRecord::Base
...
scope :ordered, order("created_at DESC")
...
end
私のモデル テストでは、news_items の順序付きリストを返す動作をテストしたいと考えています。FactoryGirl DB タッチ テストを使用して、次のようにこれを達成します。
# 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 が指摘したように、答えは No のようです。
一方、@arieljuod は、コード スニペットを実際にテストするための非常に優れた方法を提供してくれました (必ずしもモックやスタブを使用する必要はありません)。どちらも有効な答えです。