如何在 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
完成这个要求后,我会根据我们的功能提供足够的工厂,因此不会抛出上述异常。
我正在使用 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
完成这个要求后,我会根据我们的功能提供足够的工厂,因此不会抛出上述异常。