2017-11-25 10 views
0

적절한 테스트를 시도하고 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에 게시했습니다. (보통 내 간단한 질문에 대한 답변을 찾으러 왔습니다.) 앞으로의 질문을 명확하게하기 위해 할 수있는 일이 있다면 알려 주시기 바랍니다.

답변

0

클래스가 명시 적으로 정의되어 사용자가 추측 할 수 없지만 알 수 없도록합니다.

factory :user, class: User 

factory :fulfillment, class: FulFillment 
+0

그것을 시도,하지만 난 여전히 같은 오류 얻을 : 사용자 클래스 : 구문은 공장으로 밝혀졌다 :/ 사이드 노트를 사용자 – BuzzBumble

0

내가 바보 밝혀졌습니다. 내 마일스톤 모델에

validates :user, :presence 

했다. 왜 milestone을 호출하려고했는지 궁금하지 않습니다 .user

잊어 버려주세요. ] :