적절한 테스트를 시도하고 FactoryBot을 사용하여 기본 RSpec의 기능을 파악하려고합니다.FactoryGirl/Bot으로 RSpec - has_many : through를 통해 사용자에게 속한 모델의 '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
사양/공장/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
오류 나는 어떤 시험에 받고 있어요 이정표 공장이 포함됩니다.
실패 :
01 23,516,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 내가 어디하거나 마일스톤의 인스턴스에 #user 호출하려고 왜 확실하지 않다 때문에 대부분 혼란
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
보류. 공장은 사용자를위한 이행을 작성한 다음 이행을위한 이정표를 작성합니다.
추신 : 저는 처음에 StackOverflow에 게시했습니다. (보통 내 간단한 질문에 대한 답변을 찾으러 왔습니다.) 앞으로의 질문을 명확하게하기 위해 할 수있는 일이 있다면 알려 주시기 바랍니다.
그것을 시도,하지만 난 여전히 같은 오류 얻을 : 사용자 클래스 : 구문은 공장으로 밝혀졌다 :/ 사이드 노트를 사용자 – BuzzBumble