2011-07-01 30 views
3

RSpecで時間モデルをテストしようとしています。つまり、スコープのように動作するクラスメソッド 'find_days_with_no_hours'です。ビジネスhas_many STIによって関連付けられた時間。 find_days_with_no_hoursはBusinessオブジェクトから呼び出す必要があり、RSpecテストでこれを設定する方法を理解できません。 私のようなものをテストすることができるようにしたい:RSpecとのhas_manyの関連付け

bh = @business.hours.find_days_with_no_hours 
bh.length.should == 2 

私は(そしてbusiness.hours @ < < mock_modelを設定し、(Business.create、たとえば、との)ビジネス・オブジェクトの作成など、様々なアプローチを試してみましたBusinessHour、...、...、...)でも動作しません。

これは通常どのように行われますか?

答えて

8

mockでオブジェクトを作成してarelメソッドをテストすることはできません。 Arelはデータベースにまっすぐ行くつもりで、メモリに作成したモックや何も見ません。あなたは、

business = Factory.create(:business) 
business.hours << Factory.create(:unstarted_day) 

bh = business.hours.find_days_with_no_hours 
bh.length.should == 1 

しかし、factory_girlは既知の状態を設定するための単なる個人的な好みです...

テストで
Factory.define :hour do |f| 
    f.start_time {Time.now} 
end 

Factory.define :unstarted_day, :parent => :hour do |f| 
    f.start_time nil 
end 

そして:私はfactory_girlを取得し、その後、自分のための時間の工場を定義しますcreateステートメントやフィクスチャを簡単に使うことができます。問題は、mock_model()(データベースヒットを防ぐ)を使用してからデータベースを照会するメソッドを使用しようとしていたことです。