首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FactoryGirl问题与has_one和belongs_to关联

问FactoryGirl问题与has_one和belongs_to关联
EN

Stack Overflow用户
提问于 2012-12-21 23:11:16
回答 1查看 1.7K关注 0票数 6

我已经和我的社团吵了3天了,我不知道还能去哪里。我肯定这个问题很简单,但是我对Rails还很陌生,这让我很困惑…

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

用户has_one配置文件。配置文件belongs_to用户和has_one地址。地址是一个多态关联,它允许我的应用程序中的其他模型有一个与它们相关联的地址。

有一次,我让我所有的FactoryGirl定义都正常工作了,但我正在解决一个accepts_nested_attributes_for问题,并添加了一个after_initialize回调,用于构建用户的配置文件和配置文件地址。现在,我的工厂之间有一个循环引用,我的rspec输出充满了以下内容:

代码语言:javascript
复制
stack level too deep

由于在过去的几天里我已经修改了很多配置,所以我觉得最好停下来寻求帮助。这就是我来这里的原因。如果有人能帮我,我会很感激的。

以下是我的工厂配置:

用户工厂

代码语言:javascript
复制
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

配置文件工厂

代码语言:javascript
复制
FactoryGirl.define do
  factory :profile do
    address
    company_name "My Company"
    first_name "First"
    last_name "Last"
  end
end

地址工厂

代码语言:javascript
复制
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

理想情况下,我希望能够独立地测试每一家工厂。在我的用户模型测试中,我希望有这样一个有效的工厂:

代码语言:javascript
复制
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

秘方是什么?我已经看过工厂女孩的wiki和所有的网络,但我担心我没有使用正确的术语在我的搜索。此外,在我偶然发现的每个搜索结果中,似乎都有4种不同的方法可以使用混合语法在FactoryGirl中完成所有操作。

谢谢你的洞察力..。

更新日期:2012年6月12日

我把配置文件/用户关联倒转了。与其让用户引用概要文件工厂,不如将其翻转到用户工厂。

下面是最后的工厂实现:

用户工厂

代码语言:javascript
复制
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

配置文件工厂

代码语言:javascript
复制
FactoryGirl.define do
  factory :profile do
    user # <== ADDED THIS!
    company_name "My Company"
    first_name "First"
    last_name "Last"
  end
end

地址工厂

代码语言:javascript
复制
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

所有测试都通过了!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-22 06:53:58

根据发问者的要求,

你留下了profile的空白。为了链接用户和配置文件,您需要填充行的其余部分,并让FactoryGirl知道用户和配置文件是链接的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13998360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档