2014-02-19 5 views
0

저는 일부 rspec 테스트를 진행하고 있습니다. 이제는 내 초기화 매개 변수 중 하나가 "외국"클래스인데, 나는 그것이 어디서 왔는지 알지 못합니다. 그것은 사용하고있는 프레임 워크에서 주입됩니다. 내 코드에서는이 객체를 다양한 객체에 활용할 필요가 있지만, 주로 데이터를이 객체에 전달하는 메소드를 호출해야합니다 (데이터 추출 없음).RSpec이 객체의 모든 메소드를 조롱합니다.

개체를 완전히 조롱하여 특정의 정의되지 않은 메서드가 호출되는지 확인할 수 있습니까?

#an example of what this object could look like 
let(:my_obscure_object) { RSpec.complete_mock } #NOTE: This does not work 
... 
it "verify .whatever method is called" do 
    expect(my_obscure_object).to receive(:whatever).with(some_data) 
    my_class.work 
end 

it "verify .sub_whatever method is called" do 
    expect(my_obscure_object.sub_thing).to receive(:sub_whatever).with(some_data) 
    my_class.work2 
end 

이 문제를 해결하기 위해 나는 현재 생각할 수있는 방법은 객체를 만들고이

#an example of a tedious method to solve my problem 
let(:my_obscure_object) { Object.new } 
before(:each) do 
    my_obscure_object.stub(:whatever) { nil } 
    my_obscure_object.stub(:whatever2) { nil } 
    my_obscure_object.stub(:whatever3) { nil } 
    my_obscure_object.stub(:whatever4) { nil } 
    my_obscure_object.stub(:whatever5) { nil } 
    ob = Object.new 
    ob.stub(:sub_whatever) { nil } 
    my_obscure_object.stub(:sub_thing) { ob } 
end 
... 
it "verify .whatever method is called" do 
    expect(my_obscure_object).to receive(:whatever).with(some_data) 
    my_class.work 
end 
it "verify .sub_whatever method is called" do 
    expect(my_obscure_object.sub_thing).to receive(:sub_whatever).with(some_data) 
    my_class.work2 
end 

같은 내가해야 할 수도 있습니다 모든 단일 가능한 방법, 내 문제에 대한 해결책이 있습니까 스텁하는 것입니다? 다음과 같이

답변

2

당신은 호출 as_null_object를 사용하는 모든 방법을 수락 테스트 더블을 만들 수 있습니다

describe "SO example" do 
    #an example of what this object could look like 
    let(:my_obscure_object) { double("obscure").as_null_object } 
    let(:some_data) { 'foobar'} 

    it "verify .whatever method is called" do 
    expect(my_obscure_object).to receive(:whatever).with(some_data) 
    my_obscure_object.whatever(some_data) 
    end 

    it "verify .sub_whatever method is called" do 
    expect(my_obscure_object).to receive_message_chain(:whatever, :sub_whatever) 
    my_obscure_object.whatever.sub_whatever 
    end 

end 

주를 receive_message_chain 방법은 GitHub의에서 사용할 수 RSpec에의 3.0.0.beta2의로만 사용할 수 있으며한다는 것을 예상되는 인수 값을 지정할 수 없습니다. 이전 버전의 RSpec을 사용하거나 전달 된 인수를 지정하려는 경우 개별 테스트 복식을 사용하여 해당 기대치를 다시 작성할 수 있습니다.

+0

클래스가 "불분명"합니까? double 메소드에 입력 된 문자열의 의미를 찾기 위해 고생하고 있습니다. – Automatico

+0

아니요. 'double'의 첫 번째 인수는 디버깅 목적으로 사용될 수있는 핸들입니다. 그것은 RSpec의 기능의 관점에서 무시됩니다. –

+0

문서에서 발견되었습니다. 문자열은 단지 식별자 일뿐입니다. [참조 문서] (https://relishapp.com/rspec/rspec-mocks/docs) – Automatico

관련 문제