#ruby-on-rails #rspec
#ruby-on-rails #rspec
Вопрос:
Для теста контроллера в верхней части спецификации я определяю модели:
let(:user) { Factory(:user, :company => company) }
let(:facility) { Factory(:facility, :company => company) }
let(:company) { Factory(:company, :facilities => [facility]) }
И выполните базовую спецификацию индекса:
context "responding to GET index" do
it "should expose all facilities as @facilities" do
user.company.should_receive(:facilities).and_return([facility])
get :index
assigns[:facilities].should == [facility]
end
end
Но я получаю эту ошибку:
should expose all facilities as @facilities
stack level too deep
/Users/dmix/.rvm/gems/ruby-1.9.3-p0/gems/rspec-core-2.6.4/lib/rspec/core/let.rb:90
88 module InstanceMethods
89 def __memoized # :nodoc:
90 @__memoized ||= {}
91 end
92 end
Проблема, похоже, заключается в одновременной ссылке на 3 фабрики.
Если я удалю :facilities из определения фабрики компании, ошибка стека исчезнет:
let(:company) { Factory(:company) }
Как мне создать три модели, которые ссылаются друг на друга, не получая stackoverflow?
Ответ №1:
Проблема в том, что ваши facility
и company
объекты ссылаются друг на друга. Я думаю, что :facilities => [facility]
часть вашей company
фабрики может быть ненужной, поскольку вы уже обозначаете компанию facility
объекта как company
. Попробуйте это:
let(:facility) { Factory(:facility, :company => company) }
let(:company) { Factory(:company) }
Комментарии:
1. Это действительно исправляет ошибку stack too deep, но нарушает такие тесты, как: user.company.should_receive(:facilities).and_return([facility])
2. В тесте после создания фабрики вы можете просто назначить объект компании?