2017-11-25 13 views
0

適切なテストを行い、FactoryBotで基本RSpecの機能を調べようとしています。FactoryGirl/Botを使用したRSpec - has_manyを通じてユーザーに属するモデルの 'user'未定義:

注:検証テストはすべて以前に渡され、モデルファイルに含まれています。私はちょうど混乱を減らすためにそれらを削除しました。

マイモデル:

models/user.rb 

has_many :fulfillments 
has_many :milestones, through: :fulfillments 


models/fulfillment.rb 

has_many :milestones 
belongs_to :user 


models/milestone.rb 

belongs_to :fulfillments 

マイ工場:

スペック/工場/ users.rb

require 'faker' 

FactoryBot.define do 
    factory :user do 
    first_name Faker::Name.first_name 
    last_name Faker::Name.last_name 
    preferred_name Faker::Name.first_name 
    username Faker::Internet.user_name 
    email Faker::Internet.email 
    password 'password123' 
    password_confirmation 'password123' 

    factory :user_with_fulfillments do 
     transient do 
     fulfillments_count 3 
     end 

     after(:create) do |user, e| 
     create_list(:fulfillment_with_milestones, e.fulfillments_count, user: user) 
     end 
    end 
    end 
end 

スペック/工場/ fulfillments.rb

require 'faker' 

FactoryBot.define do 
    factory :fulfillment do 
    title Faker::Lorem.words.join(' ') 
    description Faker::Lorem.sentences.join(' ') 
    promise Faker::Lorem.sentence 
    reason Faker::Lorem.sentence 
    association :user, factory: :user_with_fulfillments 

    trait :userless do 
     user nil 
    end 

    factory :fulfillment_with_milestones do 
     transient do 
     milestones_count 2 
     end 

     after(:create) do |fulfillment, e| 
     create_list(:milestone, e.milestones_count, fulfillment: fulfillment) 
     end 
    end 
    end 
end 
私はすべてのテストで取得してい

スペック/工場/ milestones.rb

require 'faker' 

FactoryBot.define do 
    factory :milestone do 
    title Faker::Lorem.words.join(' ') 
    criteria Faker::Lorem.sentences.join("\n") 
    reason Faker::Lorem.sentence  
    deadline Faker::Date.forward(30) 

    association :fulfillment, factory: :fulfillment_with_milestones 
    end 
end 

一つ私に迷惑を与えているテスト(仕様/モデル/ milestone.rb)

require 'rails_helper' 

RSpec.describe Milestone, type: :model do 

    it 'has a valid factory' do 
    expect(create(:milestone)).to be_valid 
    end 

    it 'validates attributes correctly' do 
    should validate_presence_of :fulfillment 
    should validate_presence_of :title 
    should validate_presence_of :criteria 
    end 

end 

エラーマイルストーンファクトリを含む

失敗:

1) Fulfillment has a valid factory 
Failure/Error: create_list(:milestone, e.milestones_count, fulfillment: fulfillment) 

NoMethodError: 
    undefined method `user' for #<Milestone:0x00007f844d54f1b8> 
# ./spec/factories/fulfillments.rb:22:in `block (4 levels) in <top (required)>' 
# ./spec/factories/users.rb:19:in `block (4 levels) in <top (required)>' 
# ./spec/models/fulfillment_spec.rb:6:in `block (2 levels) in <top (required)>' 

    2) Milestone has a valid factory 
Failure/Error: expect(create(:milestone)).to be_valid 

NoMethodError: 
    undefined method `user' for #<Milestone:0x00007f844d8d0b98> 
# ./spec/models/milestone_spec.rb:6:in `block (2 levels) in <top (required)>' 

    3) Milestone validates attributes correctly 
Failure/Error: should validate_presence_of :fulfillment 

NoMethodError: 
    undefined method `user' for #<Milestone:0x00007f8450829700> 
# ./spec/models/milestone_spec.rb:10:in `block (2 levels) in <top (required)>' 

    4) User can have fulfillments and milestones 
Failure/Error: create_list(:milestone, e.milestones_count, fulfillment: fulfillment) 

NoMethodError: 
    undefined method `user' for #<Milestone:0x00007f8450b7b9d0> 
# ./spec/factories/fulfillments.rb:22:in `block (4 levels) in <top (required)>' 
# ./spec/factories/users.rb:19:in `block (4 levels) in <top (required)>' 
# ./spec/models/user_spec.rb:29:in `block (2 levels) in <top (required)>' 

Finished in 0.26253 seconds (files took 5.19 seconds to load) 

9例、4つの障害、1

Failed examples: 

rspec ./spec/models/fulfillment_spec.rb:5 # Fulfillment has a valid factory 
rspec ./spec/models/milestone_spec.rb:5 # Milestone has a valid factory 
rspec ./spec/models/milestone_spec.rb:9 # Milestone validates attributes correctly 
rspec ./spec/models/user_spec.rb:28 # User can have fulfillments and milestones 

ほとんどが混乱して保留中の私がどこかわからないか、なぜマイルストーンのインスタンスに#USER呼び出そうとしているため。ファクトリは、ユーザのフルフィルメントを作成し、次にフルフィルメントのマイルストーンを作成します。

PS:これは私が初めてStackOverflowに投稿したものです(私は本当に簡単な質問に答えています)。将来の質問をもっと明確にするために何かできることがあれば教えてください。

答えて

0

クラスが明示的に定義されないように、ファクトリでクラスを明示的に定義してください。

factory :user, class: User 

factory :fulfillment, class: FulFillment 
+0

はそれを試してみましたが、私はまだ同じエラーを取得する構文は 工場であることが判明:ユーザー、クラス:ユーザー – BuzzBumble

0

それは私がばか判明します。私は私のマイルストーンモデルに

validates :user, :presence 

を持っていました。なぜmilestoneを呼び出そうとしたのか不思議ではありません。

忘れてください。 ]:サイドノートを/ :

関連する問題