【问题标题】:How to create association in factory_girl, rspec/rails application如何在 factory_girl、rspec/rails 应用程序中创建关联
【发布时间】:2015-03-29 12:14:46
【问题描述】:

我正在使用 rspec 和 factory girl 开发一个有用户的应用程序,每个用户都有很多媒体帖子。要使用 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'

我的问题是,为什么它不能识别用户工厂?为什么我会遇到异常。

更新:

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

【问题讨论】:

  • 为了清楚起见,您能否添加您的MediaUser 模型的代码?
  • 感谢您的评论@PawełDawczak。你间接地向我指出了解决方案。在进行 TDD 时,我预计会失败而不是异常。这是获得异常而不是失败消息的预期行为吗?
  • 说实话 - 我不确定工厂会以何种方式失败,因为每次在定义工厂之前,我都会先试驾我的模型 - 请检查答案!祝你好运!
  • 同意。感谢您提出正确的方法。接受的答案。

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


【解决方案1】:

如果我在试驾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

满足这个要求后,我会根据我们的功能提供足够的factories,这样就不会抛出上面提到的异常了。

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2023-04-05
    相关资源
    最近更新 更多