为嵌套表单配置工厂

时间:2012-02-17 17:52:40

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 rubygems

是谁通过了这个?

场景是用户创建的嵌套表单,其中:

  1. 用户has_one个人资料
  2. 个人资料belongs_to user
  3. 所以我的工厂是以这种方式配置的,但当我运行测试时,带给我这个结果:

     Failure/Error: user_attributes[:user_attributes][:profile_attributes] = Factory.attributes_for :profile
         NoMethodError:
           undefined method `[]=' for nil:NilClass
    

    工厂

    Factory.define :user do |f|
      f.after_build do |user|  
        f.email                 'exemple@exemple.com'
        f.password              'password'
        f.password_confirmation 'password'  
        user.profile ||= Factory.build(:profile, :user => user)
      end
    end
    
    Factory.define :profile do |f| 
      f.after_build do |profile|
        profile.user ||= Factory.build(:user, :profile => profile)
    
      f.nome          'alguem'
      f.sobrenome     'alguem'
      f.endereco      'rua x'
      f.numero        '95'
      f.genero        'm'
      f.complemento   'casa'
      f.bairro        'bairro x'
      f.cidade        'cidade x'
      f.estado        'estado x'
      f.cep           '232323'
    
    
    end
    
    end
    

    Users_spec

    describe "CreateUsers" do
    
        before :each do
    
          user_attributes = Factory.attributes_for :user
          user_attributes[:user_attributes][:profile_attributes] = Factory.attributes_for :profile
    
        @user = User.new(user_attributes)
    
        end
    

1 个答案:

答案 0 :(得分:1)

假设您在创建用户时尝试自动创建配置文件,请尝试使用新的FactoryGirl语法以这种方式构建它:

工厂档案:

FactoryGirl.define do
  factory :user do
    email                 'exemple@exemple.com'
    password              'password'
    password_confirmation 'password'
    after_build do |profile|
      user.profile << FactoryGirl.build(:profile, :user => user)
    end
  end

  factory :profile do
    nome          'alguem'
    sobrenome     'alguem'
    endereco      'rua x'
    numero        '95'
    genero        'm'
    complemento   'casa'
    bairro        'bairro x'
    cidade        'cidade x'
    estado        'estado x'
    cep           '232323'
    user
  end
end

请注意,在配置文件工厂中添加user并在配置文件记录中定义关联。如果您的用户工厂被称为:user,则不必传递任何参数。

然后您应该可以致电

@user = FactoryGirl.build(:user)

它将构建用户和个人资料。您可以致电@user.profile

查看个人资料

如果您致电@user = FactoryGirl.create(:user),则会同时创建用户和个人资料,并将user_id插入个人资料记录。