Rspec 工厂女孩的问题有一个,属于协会

Rspec 工厂女孩的问题有一个,属于协会,rspec,ruby-on-rails-3.2,factory-bot,Rspec,Ruby On Rails 3.2,Factory Bot,我已经连续三天与我的社团斗争,不知道还能往哪里去。我确信这个问题很简单,但我对RubyonRails还相当陌生,这让我很困惑 我已经创建了一个用户模型,它保存了用于设计身份验证的所有登录凭据。我有另一个配置文件模型,它保存了所有用户的设置(名字等)。最后,我有一个地址模型,它使用与概要文件关联的多态关联 用户有一个配置文件。配置文件属于用户,并且有一个地址。地址是一种多态关联,它使我的应用程序中的其他模型能够拥有与它们关联的地址 有一次,我让我所有的FactoryGirl定义都正常工作,但我正在

我已经连续三天与我的社团斗争,不知道还能往哪里去。我确信这个问题很简单,但我对RubyonRails还相当陌生,这让我很困惑

我已经创建了一个用户模型,它保存了用于设计身份验证的所有登录凭据。我有另一个配置文件模型,它保存了所有用户的设置(名字等)。最后,我有一个地址模型,它使用与概要文件关联的多态关联

用户
有一个
配置文件。配置文件
属于
用户,并且
有一个
地址。地址是一种多态关联,它使我的应用程序中的其他模型能够拥有与它们关联的地址

有一次,我让我所有的FactoryGirl定义都正常工作,但我正在为
问题排除一个
接受
嵌套属性的问题,并在初始化
回调后添加了一个
,用于构建用户的配置文件和配置文件的地址。现在,我的工厂之间有一个循环引用,我的rspec输出充满了:

stack level too deep
由于过去几天我对配置进行了大量修改,我觉得最好停下来寻求帮助。:)这就是我来这里的原因。如果有人能帮我,我会非常感激

以下是我的工厂配置:

用户工厂

FactoryGirl.define do
  sequence(:email) {|n| "person-#{n}@example.com"}
  factory :user do
    profile
    name 'Test User'
    email 
    password 'secret'
    password_confirmation 'secret'
    # required if the Devise Confirmable module is used
    confirmed_at Time.now
  end
end
FactoryGirl.define do
  factory :profile do
    address
    company_name "My Company"
    first_name "First"
    last_name "Last"
  end
end
FactoryGirl.define do
  factory :address do
    association :addressable, factory: :profile
    address "123 Anywhere"
    city "Cooltown"
    state "CO"
    zip "12345"
    phone "(123) 555-1234"
    url "http://mysite.com"
    longitude 1.2
    latitude 9.99
  end
end
FactoryGirl.define do
  sequence(:email) {|n| "person-#{n}@example.com"}
  factory :user do
    #profile <== REMOVED THIS!
    name 'Test User'
    email 
    password 'please'
    password_confirmation 'please'
    # required if the Devise Confirmable module is used
    confirmed_at Time.now
  end
end
FactoryGirl.define do
  factory :profile do
    user # <== ADDED THIS!
    company_name "My Company"
    first_name "First"
    last_name "Last"
  end
end
FactoryGirl.define do
  factory :address do
    user
    association :addressable, factory: :profile
    address "123 Anywhere"
    city "Cooltown"
    state "CO"
    zip "90210"
    phone "(123) 555-1234"
    url "http://mysite.com"
    longitude 1.2
    latitude 9.99
  end
end
配置文件工厂

FactoryGirl.define do
  sequence(:email) {|n| "person-#{n}@example.com"}
  factory :user do
    profile
    name 'Test User'
    email 
    password 'secret'
    password_confirmation 'secret'
    # required if the Devise Confirmable module is used
    confirmed_at Time.now
  end
end
FactoryGirl.define do
  factory :profile do
    address
    company_name "My Company"
    first_name "First"
    last_name "Last"
  end
end
FactoryGirl.define do
  factory :address do
    association :addressable, factory: :profile
    address "123 Anywhere"
    city "Cooltown"
    state "CO"
    zip "12345"
    phone "(123) 555-1234"
    url "http://mysite.com"
    longitude 1.2
    latitude 9.99
  end
end
FactoryGirl.define do
  sequence(:email) {|n| "person-#{n}@example.com"}
  factory :user do
    #profile <== REMOVED THIS!
    name 'Test User'
    email 
    password 'please'
    password_confirmation 'please'
    # required if the Devise Confirmable module is used
    confirmed_at Time.now
  end
end
FactoryGirl.define do
  factory :profile do
    user # <== ADDED THIS!
    company_name "My Company"
    first_name "First"
    last_name "Last"
  end
end
FactoryGirl.define do
  factory :address do
    user
    association :addressable, factory: :profile
    address "123 Anywhere"
    city "Cooltown"
    state "CO"
    zip "90210"
    phone "(123) 555-1234"
    url "http://mysite.com"
    longitude 1.2
    latitude 9.99
  end
end
地址工厂

FactoryGirl.define do
  sequence(:email) {|n| "person-#{n}@example.com"}
  factory :user do
    profile
    name 'Test User'
    email 
    password 'secret'
    password_confirmation 'secret'
    # required if the Devise Confirmable module is used
    confirmed_at Time.now
  end
end
FactoryGirl.define do
  factory :profile do
    address
    company_name "My Company"
    first_name "First"
    last_name "Last"
  end
end
FactoryGirl.define do
  factory :address do
    association :addressable, factory: :profile
    address "123 Anywhere"
    city "Cooltown"
    state "CO"
    zip "12345"
    phone "(123) 555-1234"
    url "http://mysite.com"
    longitude 1.2
    latitude 9.99
  end
end
FactoryGirl.define do
  sequence(:email) {|n| "person-#{n}@example.com"}
  factory :user do
    #profile <== REMOVED THIS!
    name 'Test User'
    email 
    password 'please'
    password_confirmation 'please'
    # required if the Devise Confirmable module is used
    confirmed_at Time.now
  end
end
FactoryGirl.define do
  factory :profile do
    user # <== ADDED THIS!
    company_name "My Company"
    first_name "First"
    last_name "Last"
  end
end
FactoryGirl.define do
  factory :address do
    user
    association :addressable, factory: :profile
    address "123 Anywhere"
    city "Cooltown"
    state "CO"
    zip "90210"
    phone "(123) 555-1234"
    url "http://mysite.com"
    longitude 1.2
    latitude 9.99
  end
end
理想情况下,我希望能够独立地测试每个工厂。在我的用户模型测试中,我希望有这样一个有效的工厂:

describe "user"
  it "should have a valid factory" do
    FactoryGirl.create(:user).should be_valid
  end
end

describe "profile"
  it "should have a valid factory" do
    FactoryGirl.create(:profile).should be_valid
  end
end

describe "address"
  it "should have a valid factory" do
    FactoryGirl.create(:address).should be_valid
  end
end
什么是秘方?我在Factory Girl的维基和整个网络上都看过,但我担心我在搜索中使用的术语不正确。此外,在FactoryGirl中,似乎有4种不同的方法来完成每件事,在我偶然发现的每个搜索结果中都有混合语法

提前感谢您的任何见解

更新:12/26/2012 我的个人资料/用户关联是反向的。我没有让用户引用概要文件工厂,而是把它翻过来让概要文件引用用户工厂

以下是最终的工厂实施:

用户工厂

FactoryGirl.define do
  sequence(:email) {|n| "person-#{n}@example.com"}
  factory :user do
    profile
    name 'Test User'
    email 
    password 'secret'
    password_confirmation 'secret'
    # required if the Devise Confirmable module is used
    confirmed_at Time.now
  end
end
FactoryGirl.define do
  factory :profile do
    address
    company_name "My Company"
    first_name "First"
    last_name "Last"
  end
end
FactoryGirl.define do
  factory :address do
    association :addressable, factory: :profile
    address "123 Anywhere"
    city "Cooltown"
    state "CO"
    zip "12345"
    phone "(123) 555-1234"
    url "http://mysite.com"
    longitude 1.2
    latitude 9.99
  end
end
FactoryGirl.define do
  sequence(:email) {|n| "person-#{n}@example.com"}
  factory :user do
    #profile <== REMOVED THIS!
    name 'Test User'
    email 
    password 'please'
    password_confirmation 'please'
    # required if the Devise Confirmable module is used
    confirmed_at Time.now
  end
end
FactoryGirl.define do
  factory :profile do
    user # <== ADDED THIS!
    company_name "My Company"
    first_name "First"
    last_name "Last"
  end
end
FactoryGirl.define do
  factory :address do
    user
    association :addressable, factory: :profile
    address "123 Anywhere"
    city "Cooltown"
    state "CO"
    zip "90210"
    phone "(123) 555-1234"
    url "http://mysite.com"
    longitude 1.2
    latitude 9.99
  end
end

所有测试都通过了

根据提问者的要求


您将
profile
留空。为了链接用户和配置文件,您需要填写行的其余部分,并让FactoryGirl知道用户和配置文件已链接。

您的用户工厂中的单行
Profile
用于什么?我想你是想把它链接到创建的FactoryGirl档案?你是对的。我正在尝试使用预构建的配置文件创建用户。原因是,在我的
方法中,在用户上初始化后,我构建了一个配置文件,但当我保存它时,由于配置文件值为空,验证不允许用户保存…?@jason328您应该发布您的答案,我会给您评分。你的评论是正确的!:)非常感谢@luc为了清晰起见,你能发布最终的(固定的)用户模型吗?