Ruby on rails RSPEC和factory girl SystemStackError:堆栈级别太深
我试图解决我的规范测试的一个问题,我得到了以下错误 失败:Ruby on rails RSPEC和factory girl SystemStackError:堆栈级别太深,ruby-on-rails,rspec,factory-bot,factory,Ruby On Rails,Rspec,Factory Bot,Factory,我试图解决我的规范测试的一个问题,我得到了以下错误 失败: 1) SessionsController POST 'create' with valid email and password should sign in the user Failure/Error: Unable to find matching line from backtrace SystemStackError: stack level too deep # /Users
1) SessionsController POST 'create' with valid email and password should sign in the user
Failure/Error: Unable to find matching line from backtrace
SystemStackError:
stack level too deep
# /Users/Aurelien/.rvm/gems/ruby-1.9.2-p290@rails3/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_specification.rb:103
Finished in 37.77 seconds
9 examples, 1 failure
Failed examples:
rspec ./spec/controllers/sessions_controller_spec.rb:35 # SessionsController POST 'create' with valid email and password should sign in the user
在此之前,我与我的工厂有联系
Factory.define :role do |role|
role.name "Registered"
role.association :user, :factory => :user
end
Factory.define :admin do |role|
role.name "Admin"
role.association :user, :factory => :user
end
Factory.define :user do |user|
user.first_name "Foo"
user.last_name "Bar"
user.email "foo@bar.com"
user.password "foobar"
user.password_confirmation "foobar"
user.status "At foobar"
user.description "Lorem Ipsum sit dolor amet."
user.username "foobar"
user.association :role, :factory => :role
user.association :admin, :factory => :role
end
Factory.define :user_with_admin_role, :parent => :user do |user|
user.after_create { |u| Factory(:role, :user => u) }
end
Factory.define :reg_user do |user|
user.first_name "bar"
user.last_name "foo"
user.email "bar@foo.com"
user.password "foobar"
user.password_confirmation "foobar"
user.status "At foobar"
user.description "Lorem Ipsum sit dolor amet."
user.username "barfoo"
user.association :role, :factory => :role
end
到目前为止,我的会话测试包括:
describe "POST 'create'" do
describe "invalid signin" do
before(:each) do
@attr = { :email => "email@example.org", :password => "invalid" }
end
it "should re-render the 'new' page with a flash error" do
post :create, :session => @attr
flash.now[:error] =~ /invalid/i
response.should render_template('new')
end
end
describe "with valid email and password" do
before(:each) do
@user = Factory(:user)
@attr = { :email => @user.email, :password => @user.password}
end
it "should sign in the user" do
post :create, :session => @attr
controller.current_user.should == @user
end
end
end
我真的不确定是什么造成了这个问题。
在我的模型中,我为每个用户分配一个默认角色作为“已注册”,并为第一个用户分配一个“管理员”角色
user.rb
def assign_default_role
if User.count == 0
self.roles << Role.find_by_name("Admin")
self.roles << Role.find_by_name("Registered")
end
self.roles << Role.find_by_name("Registered") unless User.count == 0
end
def分配默认角色
如果User.count==0
self.roles问题是:
@user = Factory(:user)
您有一个循环引用:您的:user
工厂创建一个:role
和:admin
工厂。然后:role
和:admin
工厂分别创建另一个:user
工厂,然后创建另一个:role
和:admin
工厂,依此类推,直到出现堆栈级别太深的错误
您需要删除其中一些关联。我建议从:role
和:admin
中删除角色.association
行。无论何时创建:user
,它都会为您创建:role
和:admin
行。谢谢Dylan,我理解循环问题,但现在我要返回以前的错误NoMethodError:undefined method
role='for#`。至少我了解创建的循环:)。可能是重复的