適切なテストを行い、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に投稿したものです(私は本当に簡単な質問に答えています)。将来の質問をもっと明確にするために何かできることがあれば教えてください。
はそれを試してみましたが、私はまだ同じエラーを取得する構文は 工場であることが判明:ユーザー、クラス:ユーザー – BuzzBumble