Тестирование has_many ассоциации с RSpec - PullRequest
3 голосов
/ 02 июля 2011

Я пытаюсь протестировать модель Hour с RSpec, а именно метод класса 'find_days_with_no_hours', который ведет себя как область видимости. Бизнес has_many Часы, связанные через STI. 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, ..., ..., ...), но это не работает </p>

Как это обычно делается?

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

1 Ответ

8 голосов
/ 02 июля 2011

Вы не можете проверить метод 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 () (который предотвращает попадание в базу данных), а затем использовать метод, который запрашивает базу данных.

...