2014-03-26 29 views
0

我试图使用class_double方法这里解释:https://relishapp.com/rspec/rspec-mocks/docs/verifying-doubles/using-a-class-doubleRspec的测试,如果实例方法调用对象的方法

这里是我的代码:

search.rb

class Search < ActiveRecord::Base 
    def find_events 
    events = Event.find_by_dates(beginning_date, end_date) 
    end 
end 

event.rb

class Event < ActiveRecord::Base 
    scope :find_by_dates, ->(starting_date , ending_date) { where('(date(start_datetime) >= ? AND date(end_datetime) <= ?)', starting_date.to_date, ending_date.to_date)} 
end 

search_spec.rb

let(:march1) {DateTime.parse('1st March 2014')} 
    let(:march3) {DateTime.parse('3rd March 2014')} 
    let(:march_search) {create(:search, beginning_date: march1, end_date: march3)} 
    let(:mar1_event) {create(:event, 
         start_datetime: DateTime.parse('1st March 2014 04:00:00 PM'), 
         end_datetime: DateTime.parse('1st March 2014 06:00:00 PM'))} 

    let(:mar2_event) {create(:event, 
         start_datetime: DateTime.parse('2nd March 2014 04:00:00 PM'), 
         end_datetime: DateTime.parse('2nd March 2014 06:00:00 PM'))} 

    let(:mar1_to_3_event) {create(:event, 
          start_datetime: DateTime.parse('1st March 2014 04:00:00 PM'), 
          end_datetime: DateTime.parse('3rd March 2014 06:00:00 PM'))} 
    let(:march_search) {create(:search, beginning_date: march1, end_date: march3)} 


describe 'find_events method' do 
    it 'should call Event.find_by_dates' do 
    event = class_double("Event").as_stubbed_const(:transfer_nested_constants => true) 
    expect(event).to receive(:find_by_dates).with(march1, march3) 
    march_search.find_events 
end 
it 'should return events within a date range' do 
    events = march_search.find_events 
    expect(events).to include(mar1_event, mar2_event, mar1_to_3_event) 
end 

it 'it should not return events outside of the date range' do 
    events = sept_search.find_events 
    expect(events).to_not include(mar1_event, mar2_event, mar1_to_3_event) 
end 

到目前为止,没有问题,直到我要检查,如果没有找到结果,并返回一个字符串

def find_events 
    events = Event.find_by_dates(beginning_date, end_date) 
    if events.empty? 
    return "SORRY NO RESULTS FOUND" 
    end 
end 

然后我收到以下错误

失败:

1) Search find_events method it should not return events outside of the date range 
Failure/Error: expect(events).to_not include(mar1_event, mar2_event, mar1_to_3_event) 
TypeError: 
    no implicit conversion of Event into String 
# ./spec/models/search_spec.rb:93:in `block (3 levels) in <top (required)>' 

2) Search find_events method should call Event.find_by_dates 
Failure/Error: march_search.find_events 
NoMethodError: 
    undefined method `empty?' for nil:NilClass 
# ./app/models/search.rb:41:in `find_events' 
# ./spec/models/search_spec.rb:84:in `block (3 levels) in <top (required)>' 

3) Search find_events method should return events within a date range 
Failure/Error: expect(events).to include(mar1_event, mar2_event, mar1_to_3_event) 
TypeError: 
    no implicit conversion of Event into String 
# ./spec/models/search_spec.rb:88:in `block (3 levels) in <top (required)>' 

我有Event.find_by_dates看看它是否为零,但收到以下错误: 未定义的方法`include?'为零:NilClass

我真的需要检查是否返回一个空的ActiveRelation对象来停止继续搜索。任何人都可以告诉我如何测试空的而不是空的搜索结果?

谢谢!

回答

1

测试是错误的地方。测试Event类的Event.find_by_dates返回的内容。

所有你关心的Search类中的find_events是它是返回一个事件集合还是一个字符串。

因此,您只需在Event上存根find_by_dates以返回空或不空的东西。

所以要Event.any_instance.stub(:find_by_dates).and_return('')

PS相当于,不要忘记在测试后unstub它。 :(

+0

我已经测试了Event.find_by_dates,但是现在我需要检查当该方法以及其他几个链接在一起时search.find_events被调用时会发生什么,我还需要确保Event类方法正在被呼叫。 –