2016-09-12 3 views
0

나는 주로 레일 테스트 도구를 사용하여 테스트를 수행하고 있습니다. rspec, factory_girl, shoulda, and faker gems.factorygirl을 사용하여 user_id를 연결하는 방법

has_onebelongs_to 연관을 테스트하고 싶습니다. 나는 user.rb (name)이고 address.rb (street, cityuser_id) 모델을 가지고 있습니다.

위조자를 사용하여 가짜 연관을 만드는 방법을 알아 내려고하고 있습니다. 이 사양은

FactoryGirl.define do 
    factory :address do 
    street {Faker::Address.street_address} 
    city  {Faker::Address.city} 
    #Creates fake user and use that user's id for user_id)# 
    user = build(:user, name: "Joe", id: 2) 
    user_id {user.id} 
    end 
end 

: 이것은 내가 현재 가지고 무엇을 나는 가짜 거리를 만들고 가짜 사용자와 연결 싶지만 spec/factories/addresses.rb

에 작업을 수행하는 방법을 알아낼 수 없습니다 /models/address_spec.rb

require 'rails_helper' 

RSpec.describe Address, type: :model do 
    it "has a valid factory" do 
    address = build(:address) 
    expect(address).to be_valid 
    end 
    it {should belong_to(:user)} 
end 

나는 그것을 실행

, 그것은 add_attribute': wrong number of arguments (given 3, expected 1..2) (ArgumentError) 오류를 보여줍니다. 나는 인수에서 ID를 제거하려고 시도하고 그냥 user = build(:user, name: "Joe") 않았다 그러나 여전히 동일한 오류 메시지가 표시됩니다.

addresses 공장에 사용자 회선을 포함시키지 않으면 테스트 을 전달합니다. 나는 주소가 belongs_to :user이고 사용자는 has_one :address임을 확인했다.

가짜 연관을 생성하고 가짜 주소를 연결할 수 있습니까? user.id? Addressuser_id도 테스트하고 싶습니다.

편집 - 관련 공장 및 모델은 다음과 같습니다

공장

addresses.rb

FactoryGirl.define do 
    factory :address do 
    street {Faker::Address.street_address} 
    city  {Faker::Address.city} 
    user 
    end 
end 

users.rb

FactoryGirl.define do 
    factory :user do 
    name  {Faker::Name.name} 
    end 
end 

사양/모델

address_spec.rb

require 'rails_helper' 

RSpec.describe Address, type: :model do 
    it "has a valid factory" do 
    association user 
    specific_user = build(:user, name: 'Joe') 
    address = build(:address, specific_user) 
    expect(address).to be_valid 
    end 
    it {should belong_to(:user)} 
end 

오류 실행 address_spec.rb

NameError: 
    undefined local variable or method `user' for #<RSpec::ExampleGroups::Address:0x00000001a94b00> 
# ./spec/models/addres 

답변

1

난 당신이 관계를 구축하는 방식이 잘못 생각합니다. https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations을 참조하십시오.

보다 구체적인 사용자 (예 : 이름 : Joe, id : 2)를 원한다면 사양에서 수행하는 것이 좋습니다.

공장 :

FactoryGirl.define do 
    factory :address do 
    street {Faker::Address.street_address} 
    city  {Faker::Address.city} 
    user 
    end 
end 

사양 :

나는이 오류`등록되지 형질 가지고
it "has a valid factory" do 
    specific_user = build(:user, name: 'Joe') 
    address = build(:address, specific_user) 
    expect(address).to be_valid 
end 
+0

#을 <사용자 : 0x00000005c96850>'.스펙에'association user'를 추가했지만, 이제'undefined local variable 또는 method'user ''를 보여줍니다 ... 내가 누락 된 것이 무엇인지 알고 계십니까? – Iggy

+0

'user'에 대한 팩토리를 정의해야합니다. – kasperite

+0

'FactoryGirl.define do; 공장 : 사용자가; 이름 {Faker :: Address.name}; 종료; 끝 '공장/users.rb에. 나는 그 사용자가 어떻게 든 존재한다는 것을'주소'가 알도록해야만 하는가? – Iggy

관련 문제