2011-12-29 2 views
3

Как настроить следующие модели/спецификации для издевательств в спецификации моего контроллера.Stubbing ActiveRecord динамические искатели с RSpec

Вот модели

class User < ActiveRecord::Base 
    has_many :favorites 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :place 
end 

class Place < ActiveRecord::Base 
    has_many :favorites, :as => :favorable 
end 

Тогда в какой-то момент место будет проверяться, чтобы увидеть, если он в настоящее время является любимым

@favorite = @current_user.favorites.find_by_place_id(@place.id) 

Теперь я хочу, чтобы дразнить пользователя для некоторых примеров

it "should be success" do 
    user = double("User") 
    user.stub(:favorites) 
    get :show, :id => "1081651" 
    response.should be_success 
end 

Но, в конечном итоге с

undefined method `find_by_place_id' for nil:NilClass 

Что мне делать с: фаворитами, чтобы помочь им пройти. Поскольку используется динамический искатель, я не уверен, как правильно имитировать это.

ответ

2

Используйте нулевой объект окурок, который будет игнорировать все неожиданные сообщения:

user.stub(:favorites).and_return(double.as_null_object) 

Другим способ заключается в использовании stub_chain метода:

user.stub_chain(:favorites, :find_by_place_id) 
+0

Я пробовал различные варианты, что и возвращающийся ноль из : избранное заглушка, но не повезло. Проблема заключается не в том, что метод не ожидается, а в том, что ему нужно вернуть то, на что может работать find_by_place_id, и он не может работать на нуле. – RyanW

+0

@RyanW справа, попробуйте вернуть нулевой объект из stubbed 'favorite' метода. Отредактировал ответ. –

1
favorite = double('Favorite') 
user.stub_chain(:favorites, :find_by_place_id) { favorite } 
Смежные вопросы