如何在 factory_girl、rspec/rails 应用程序中创建关联

How to create association in factory_girl, rspec/rails application

我正在使用 rspec 和 factory girl 开发一个有用户的应用程序,每个用户都有很多媒体 post。为了使用 TDD,我使用 factory_girl.

设置应用程序后,我在spec/factories中得到了两个文件:

users.rb

FactoryGirl.define do
  factory :user do
    sequence(:first_name) {|n| "FirstName-#{n}"}
    sequence(:last_name) {|n| "LastName-#{n}"}
    sequence(:email) {|n| "email-#{n}@example.com"}
    password 'chandan123'
    password_confirmation 'chandan123'
  end
end

和 medias.rb

FactoryGirl.define do
  factory :media do
    sequence(:description) {|n| "Description #{n}"}
    sequence(:url) {|n| "http://www.example-#{n}.com"}
    association :user, factory: :user

    factory :public_media do
      permission Media.permissions[:is_public]
    end

    factory :private_media do
      permission Media.permissions[:is_private]
    end
  end
end

现在,当我 运行 rspec 时,出现以下错误:

$ rspec


Finished in 0.08492 seconds (files took 3.21 seconds to load)
0 examples, 0 failures

/Users/chandankumar/.rvm/gems/ruby-2.1.4/gems/activemodel-4.2.0/lib/active_model/attribute_methods.rb:433:in `method_missing': undefined method `user=' for #<Media:0x007fb5d0b57b50> (NoMethodError)
    from /Users/chandankumar/.rvm/gems/ruby-2.1.4/gems/factory_girl-4.4.0/lib/factory_girl/attribute_assigner.rb:16:in `block (2 levels) in object'
    from /Users/chandankumar/.rvm/gems/ruby-2.1.4/gems/factory_girl-4.4.0/lib/factory_girl/attribute_assigner.rb:15:in `each'
    from /Users/chandankumar/.rvm/gems/ruby-2.1.4/gems/factory_girl-4.4.0/lib/factory_girl/attribute_assigner.rb:15:in `block in object'
    from /Users/chandankumar/.rvm/gems/ruby-2.1.4/gems/factory_girl-4.4.0/lib/factory_girl/attribute_assigner.rb:14:in `tap'
    from /Users/chandankumar/.rvm/gems/ruby-2.1.4/gems/factory_girl-4.4.0/lib/factory_girl/attribute_assigner.rb:14:in `object'
    from /Users/chandankumar/.rvm/gems/ruby-2.1.4/gems/factory_girl-4.4.0/lib/factory_girl/evaluation.rb:12:in `object'
    from /Users/chandankumar/.rvm/gems/ruby-2.1.4/gems/factory_girl-4.4.0/lib/factory_girl/strategy/build.rb:9:in `result'
    from /Users/chandankumar/.rvm/gems/ruby-2.1.4/gems/factory_girl-4.4.0/lib/factory_girl/factory.rb:42:in `run'

我的问题是,为什么它无法识别用户工厂?为什么我会超越异常。

更新:

我必须添加迁移才能在 database/model 级别进行关联。一旦完成,它就完美地解决了。糟糕的是,我的印象是 rspec 会给我失败消息而不是异常。

如果我试驾 Media 模型 - 我宁愿在定义工厂之前尝试实施适当的方法。所以,我将从以下内容开始:

spec/models/media_spec.rb

RSpec.describe Media do
  subject { Media.new }

  # ...

  it { is_expected.to respond_to :user }
end

当 运行 您的测试时,这将促使您在 Media:

中创建适当的关联
class Media < ActiveRecord::Base
  belongs_to :user
end

完成这个要求后,我会根据我们的功能提供足够的工厂,因此不会抛出上述异常。