我正在使用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'
我的查询是,为什么它无法识别用户工厂?为什么我会超越异常。
我必须添加迁移才能在数据库/模型级别进行关联。一旦完成,它就完美地完成了。我的坏,我的印象是rspec会给我失败的消息而不是异常。
答案 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
在满足此要求后,我会根据我们的功能提供足够的工厂,因此不会引发异常。