如何创建与FactoryGirl和Rspec的has_one关联的子对象?

时间:2016-09-07 01:26:56

标签: ruby-on-rails rspec factory-bot

我已经浏览了google和stackoverflow以查找我的问题,并找到了一些类似的问题,但没有一个可以解决我的问题。

在我的应用中,用户has_one个人资料和个人资料belongs_to用户。

我正在尝试测试一些用户功能,我需要创建一个与我的测试用户相关联的测试配置文件才能正确执行此操作。

这是我的工厂/ user_factory.rb

FactoryGirl.define do 

  factory :user do 

    email {Faker::Internet.safe_email}
    password "password"
    password_confirmation "password"

  end

end

这是我的工厂/ profile_factory.rb

FactoryGirl.define do 

  factory :profile do 

    phone Faker::PhoneNumber.phone_number
    college Faker::University.name
    hometown Faker::Address.city
    current_location Faker::Address.city
    about "This is an about me"
    words_to_live_by "These are words to live by"
    first_name {Faker::Name.name}
    last_name {Faker::Name.name}
    gender ["male", "female"].sample
    user


  end


end

以下是我需要创建关联配置文件的功能/ users_spec.rb:

require 'rails_helper'



feature "User accounts" do 

  before do 
    visit root_path
  end

  let(:user) {create(:user)}
  let(:profile) {create(:profile, user: user)}

  scenario "create a new user" do 
    fill_in "firstName", with: "First"
    fill_in "lastName", with: "Last"
    fill_in "signup-email", with: "email@email.com"
    fill_in "signup-password", with: "superpassword"
    fill_in "signup-password-confirm", with: "superpassword"
    #skip birthday=>fill_in "birthday", with: 
    #skip gender
    expect{ click_button "Sign Up!"}.to change(User, :count).by(1)


  end

  scenario "sign in an existing user" do




    sign_in(user)
    expect(page).to have_content "Signed in successfully"
  end

  scenario "a user that is not signed in can not view anything besides the homepage" do 


  end


end #user accounts

现有用户中的方案签到我需要关联的个人资料。

现在我只是使用工厂创建个人资料

let(:profile) {create(:profile, user: user)}

我尝试传递create block以关联配置文件,我尝试重写配置文件的user_id属性以将其与创建的用户关联,但两者都没有工作。理想情况下,我想设置它,以便无论何时创建用户,都会为其创建关联的配置文件。有什么想法吗?

我知道这不会太难我只是无法提出解决方案。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

最简单的方法是让工厂与协会同名。在您的情况下,如果关联是配置文件,您可以隐式创建关联的配置文件记录以及用户记录。只需使用相关工厂的名称,就像这样。

factory :user do
   ...
  profile
end

如果您需要更多控制权,那么Factory Girl的关联就是您所需要的。您可以覆盖属性并从关联名称中选择不同的工厂名称。此处,关联名称为 prof ,工厂为 profile lastName 字段被覆盖。

factory :user do
    ...
  association :prof, factory: :profile, lastName: "Johnson"
end

您可以在Factory Girl的Getting Started找到更多信息。