我有一个规格和一个工厂,我收到此错误:
SystemStackError: stack level too deep
from gems/activerecord-4.2.1/lib/active_record/relation/delegation.rb:9:in `relation_delegate_class'
当我尝试使用verbage'build'时,它可以工作;但是我需要它来保存测试数据并且“创建”在let!(:user) { create(:user) }
中不起作用,因为它会引发该错误。 Rspec似乎工作正常。
我正在运行ruby 2.2.2;使用rspec和工厂女孩
require 'spec_helper'
describe API::V1::CurrentUserController do
let!(:user) { create(:user) }
setup_api_authorization
describe "GET 'show'" do
before (:each) do
setup_api_headers
get 'show', subdomain: 'api', id: 'me'
end
end
FactoryGirl.define do
factory :user, aliases: [:participant] do
sequence(:email) { |n| "user#{n}@example.com" }
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
password 'testpass'
password_confirmation { |user| user.password }
role_id {4}
end
end
答案 0 :(得分:0)
要设置关联,您只需调用工厂名称:
FactoryGirl.define do
factory :user, aliases: [:participant] do
sequence(:email) { |n| "user#{n}@example.com" }
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
password 'testpass'
password_confirmation { password }
role
end
end
永远不要将ID硬编码到您的工厂 - 您只是为自己创造了一个受伤的世界。
如果您使用的是Rolify,则可以使用回调向用户添加角色:
FactoryGirl.define do
factory :user, aliases: [:participant] do
sequence(:email) { |n| "user#{n}@example.com" }
first_name { Faker::Name.first_name }
last_name { Faker::Name.last_name }
password 'testpass'
password_confirmation { password }
after(:create) { |user| user.add_role(:peasant) }
end
end
答案 1 :(得分:0)
当您意外递归时,通常会发生此错误 更改属性。如果您在用户模型中有用户名属性, 以及一个名为username的虚拟属性,它直接改变了 用户名,你最终调用虚拟,虚拟调用 虚拟再次等等。因此,看看是否有事 就像在你的代码中某处发生的那样。