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

时间:2015-03-29 12:14:47

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

我正在使用rspec和工厂女孩开发一个有用户的应用程序,每个用户都有很多媒体帖子。要使用TDD我正在使用factory_girl。

设置应用程序后,我在规范/工厂中获得了两个文件:

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'

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

UPDATE:

我必须添加迁移才能在数据库/模型级别进行关联。一旦完成,它就完美地完成了。我的坏,我的印象是rspec会给我失败的消息而不是异常。

1 个答案:

答案 0 :(得分:0)

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

规格/模型/ 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

在满足此要求后,我会根据我们的功能提供足够的工厂,因此不会引发异常。