3

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

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

ビジネスオブジェクトを作成し(Business.createなど)、 @business.hours << mock_model(BusinessHour, ..., ..., ...) を設定するなど、さまざまなアプローチを試しましたが、そうではありません。動作しません。

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

class Business < ActiveRecord::Base

  has_many :hours, :as => :hourable

end

class Hour < ActiveRecord::Base

  belongs_to :hourable, :polymorphic => true

  def self.find_days_with_no_hours
    where("start_time IS NULL")
  end

end
4

1 に答える 1

8

モックを介してオブジェクトを作成することによって、arel メソッドをテストすることはできません。Arel はデータベースに直接アクセスし、モックやメモリ内に作成したものは表示しません。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

そして、あなたのテストで...

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

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

ただし、 factory_girl は、既知の状態を設定するための個人的な好みにすぎません。createステートメントやフィクスチャを簡単に使用できます。問題は、mock_model() (データベースのヒットを防ぐ) を使用しようとして、クエリを実行するメソッドを使用することでした。データベース。

于 2011-07-01T20:17:49.767 に答える