3

我正在尝试使用 RSpec 测试 Hour 模型,即行为类似于范围的类方法“find_days_with_no_hours”。通过 STI 关联的业务 has_many Hours。find_days_with_no_hours 需要通过业务对象调用,我不知道如何在 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 回答