2011-07-01 2 views
3

Я пытаюсь проверить модель Hour с RSpec, а именно метод класса find_days_with_no_hours, который ведет себя как область. Бизнес has_many Часы, связанные через STI. find_days_with_no_hours необходимо вызвать через объект Business, и я не могу понять, как это установить в тесте RSpec. Я хочу, чтобы иметь возможность испытать что-то вроде:Тестирование has_many ассоциации с 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 

ответ

8

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

Смежные вопросы