2014-12-16 4 views
2

테스트하는 동안 일대 다 관계에서 연결된 모델에 액세스하는 데 문제가 있습니다. 나는 왜 아래가 협회를 돌려주지 않는지 이해하지 못한다.Rails 관련 컨트롤러 문제 Rspec을 사용한 테스트

내가이 문제를 걱정하는 이유는 Factory Girl을 사용하여 my_factory_girl_user.guardians.first를 통해 보호자에게 연락하기를 원했기 때문입니다. ActiveRecord를 사용하여 단순화하려고 시도했지만 여전히 예상대로 작동하지 않습니다.

저는 진정한 레일 초보자입니다. 그래서이 문제에 대한 조언이나 더 나은 디버깅 방법에 많은 도움이 될 것입니다!

질문 : @ target_user.guardians가 왜 아무 것도 반환하지 않습니까?

사용자 모델

class User < ActiveRecord::Base 
    has_many :guardians, dependent: :destroy 
    ... 
end 

가디언 모델

class Guardian < ActiveRecord::Base 
    belongs_to :user 
    ... 
end 

컨트롤러 사양

describe 'PUT #update' do 
context 'when logged in and authorized' do 
    let(:new_attributes){ 
    {level: 31} 
    } 
    it 'sets current guardian' do 
    @target_user = User.create!(profile_name: 'MyGuardian', system: 'Xbox One', region: 'North America', password: "password", password_confirmation: "password") 
    @target_guardian = Guardian.create!(level: 31, guardian_class: 'Titan', activity: 'Vault of Glass', user_id: @target_user.id) 
    puts "User: #{@target_user.inspect}" 
    puts "Guardian: #{@target_guardian.inspect}" 
    puts "user.guardians: #{@target_user.guardians}" 
    put :update, {id: @target_guardian.id, guardian: new_attributes}, {user_id: @target_user.id} 
    expect(assigns(:guardian)).to eq(@target_guardian) 
    end 
end 

출력

User: #<User id: 3147, email: nil, password_digest: "$2a$04$QPk3kCsKLp0IX.YmMPAPdO2gCe79mwVybHkFpcEsVkG...", created_at: "2014-12-16 02:55:57", updated_at: "2014-12-16 02:55:57", is_admin: nil, profile_name: "MyGuardian", system: "Xbox One", region: "North America"> 
Guaridan: #<Guardian id: 3284, created_at: "2014-12-16 02:55:57", updated_at: "2014-12-16 02:55:57", user_id: 3147, fireteam_id: nil, level: 31, guardian_class: "Titan", activity: "Vault of Glass", comment: nil> 
user.guardians: 

답 :

감사합니다. Typpex에게 도움을 요청합니다. 내 이슈는 내가 Guardian을 생성 한 후 User를 새로 고치지 않았다는 것이 었습니다. 제가 사용했던 솔루션은 Guardian을 생성 한 후 아래 라인을 추가하는 것이 었습니다. 자세한 내용은 아래의 해답을 읽어보십시오.

@target_user.guardians << @target_guardian 

만 그 후 @ target_user.guardians에 보호자를 볼 수 있습니다 :

@target_user.reload 

답변

0

그것은 당신이 실제로 같은 사용자의 보호자 목록에 보호자를 추가하지 않기 때문에이다. RSpec에와 테스트 할 때

는 사용자의 보호자 컬렉션에 보호자를 추가하고 보호자가 올바르게에 대한

@target_user.guardians.size.should_be 1 
+0

감사처럼 뭔가 추가 된 경우 다음 테스트 actualling되는 컨트롤러의 액션을 호출 할 필요가 논평! 나는 당신의 제안을 덧붙이려고 노력했고 같은 출력을 얻었다. 나는 협회가 일하는 방식이 열쇠를 기반으로한다고 생각했습니다. 후견인에게 user_id를 지정했기 때문에 링크 될 것이라고 생각했습니다. 나는 아직도 내가 빠진 것을 이해하지 못한다. –

+0

target_user 및 target_guardian이 올바르게 작성되었는지 확인할 수 있습니까? target_user.valid? should_be true target_guardian.valid.should_be true 그 중 하나가 틀린 경우 model.errors.inspect를 검사하여 이유를 확인할 수 있습니다. 실제로 당신 말이 맞습니다. target_user.guardians << target_guardian 할 때 guardian 테이블의 user_id 필드를 채울 것입니다. :) – Typpex

+0

당신이 옳았어요. 나는 다른 곳에서 작은 변화를 만들어 출력을 버리는 것을 잊어 버렸습니다. 귀하의 원래 제안에 따라 협회가 수정되었습니다. 나는 또한 일한 target_user.reload를 시도했다. 내 이해는 근본적인 문제는 보호자를 만든 후 데이터베이스에서 새 값으로 target_user를 새로 고쳐야한다는 것이 었습니다. 모든 도움을 주셔서 감사합니다! –

관련 문제