2013-01-31 1 views
1

스텁에 문제가 있습니다. 어떻게 작동하는지 오해해야합니다.Rspec 스텁 행동

스텁은 생성 된 컨텍스트 내에 만 존재합니까? 그것은 내 기대이지만, 내 경험에서 문맥 내에서 메소드를 스텁한다면 다른 컨텍스트에서 여전히 존재합니다.

내 컨트롤러 시험이 유사합니다

describe '.load_articles' do 
    context 'articles' do 
    before(:each) do 
     Article.stub_chain(:meth1, :meth2).and_return(['article']) 
    end 
    it 'sets articles' do 
     controller.load_articles.should == ['article'] 
    end 

    end 
    context 'no articles' do 
    before(:each) do 
     Article.stub_chain(:meth1, :meth2).and_return([]) 
    end 
    it 'sets article' do 
     controller.load_articles.should == [] 
    end 

    end 
end 

내가 []

내가 너무 오래이 붙어 있었어요을 기대하고있을 때 두 번째 예를 들어 controller.load_articles 여전히 ['article']을 반환

; 어떤 도움이라도 대단히 감사합니다!

+0

이 파일은 테스트하고있는 실제 파일입니까 아니면 가상 코드 했습니까? 내가 물어 보는 이유는 당신이'load_articles'를 어디에서든지 쓴 것이 아니기 때문입니다. 여러분은'meth1'과'meth2'를 스터 빙하고 있습니다. 이와 같은 컨텍스트 블록 내에서 적절한 스텁을 사용하면 나타나는 동작이 발생하지 않아야합니다. –

+0

'meth1'과'meth2'는'article'에서'load_articles'가 호출하는 것일뿐입니다.하지만 더 많은 부분이 진단을 도와 줄 수 있습니다. 이 방법에 대한 몇 가지 특성이 유용 할 수 있습니다. 또한 거기에 간섭을 일으킬 수있는 캐싱/메모가 있습니까? –

답변

1

각 예제 후에 스텁이 지워집니다. 당신은 이것을 매우 쉽게 증명할 수 있습니다 :

class Numero; end 

describe Numero do 
    context "Uno" do 
    before do 
     Numero.stub_chain(:meth1, :meth2) { 'uno' } 
    end 
    it "unos" do 
     Numero.meth1.meth2.should == 'uno' 
    end 
    end 
    context "Dos" do 
    before do 
     Numero.stub_chain(:meth1, :meth2) { 'dos' } 
    end 
    it "dosses" do 
     Numero.meth1.meth2.should == 'dos' 
    end 
    end 
end