2016-09-21 2 views
0

나는 루비와 레일에 스펙을 쓰는 법을 배우는 중이다. 따라서 투표 할 때 유사한 2 가지 유사한 모델, 즉 질문과 답변이 있습니다. 그래서 나는 코드를 복제하지 않고이 두 가지에 대한 공유 예제를 작성하려고합니다.공유 예제를 설정하는 방법은 무엇입니까?

RSpec.shared_examples_for 'User Votable' do 

    let!(:user){ create :user } 
    let!(:sample_user){ create :user } 
    let!(:vote){ create :vote, user: user, votable: votable, vote_field: 1} 

    it 'user different from resource user is accapteble' do   
    expect(votable.user_voted?(sample_user)).to be_falsy 
    end 

    it 'user similar to resource user is accapteble' do 

    expect(votable.user_voted?(user)).to be_truthy 
    end 

end 

그리고 테스트 자체가이 사양에 마지막 실패

describe 'user_voted?' do 
    def votable 
    subject{ build(:question)} 
    end 
    it_behaves_like 'User Votable' 
end 

는 (I 때문에 주제의 생각 - 나는 투표를 만들 때 변경되지 않습니다) 그래서 나는 경우 매우 행복 할 것 나는 그것을 올바른 방법으로 관리하고 이해할 수있었습니다. 나는이 같은 모의을 사용하려고 할 때 어떤 조언

매우 감사는 또한, user_voted 기본 키

allow(:question){create :question} 

Failures: 

1) 질문을 가지고 있지에 불만? 사용자가 accapteble 장애/오류입니다 자원과 유사한 사용자 투표 가능한 사용자처럼 동작 : 기대 (? votable.user_voted (사용자)) 당신과 같은 subject을 설정할 수있는 votable 방법을하는 대신

expected: truthy value 
     got: false 
Shared Example Group: "User Votable" called from ./spec/models/question_spec.rb:23 
+0

그냥'데프 투표 가능한 할; 빌드 (: 질문); end' –

+0

def votable build (: question) end 비슷한 오류가 발생했습니다 (업데이트 됨) –

답변

1

을 be_truthy 할 수 있습니다. :

it_behaves_like 'User Votable' do 
    subject { build(:question) } 
end 
+0

그리고이 스펙을 어떻게 수정해야합니까? –

1

당신은 실제로 당신이 당신이 let를 사용하여 원하는대로 상황 설정할 수 있습니다, subject를 사용할 필요가 없습니다 그리고 그것은 블록 내에서 사용할 수 있습니다 :

describe 'user_voted?' do 
    let(:votable) { build(:question) } 
    it_behaves_like 'User Votable' 
end 

그런 다음 당신은 문맥에 의해 당신의 공유 예에서 votable을 참조 할 수 있습니다 그것은 정의됩니다 : 당신은 또한 부수적으로 더 많은 유연성을 위해 it_behaves_like 블록에 매개 변수를 전달할 수 있습니다

RSpec.shared_examples_for 'User Votable' do 
    let!(:user) { create :user } 
    let!(:sample_user) { create :user } 
    let!(:vote) { create :vote, user: user, votable: votable, vote_field: 1 } 

    it 'user different from resource user is acceptable' do   
    expect(votable.user_voted?(sample_user)).to be_falsy 
    end 

    it 'user similar to resource user is acceptable' do 
    expect(votable.user_voted?(user)).to be_truthy 
    end 
end 

.

참조 : Providing context to a shared group using a block

(참고 :. 위의 맞춤법 오타 수정)

관련 문제