2017-08-22 62 views
0

情況:我想存根輔助方法,以便我可以調用一個包裝它的方法並獲取存根響應。Stub一個由包裝器方法調用的'嵌套'類方法(RSpec Mocks)

代碼設置如下:

class Thing 
    def self.method_one(foo) 
    self.method_two(foo, 'some random string') 
    end 

    def self.method_two(foo, bar) 
    self.method_three(foo, bar, 'no meaning') 
    end 

    def self.method_three(foo, bar, baz) 
    "#{foo} is #{bar} with #{baz}" 
    end 
end 

我試圖嘲弄.method_three,這樣我可以打電話.method_one並使其最終調用.method_three的兩倍,而不是真正的交易:

it "uses the mock for .method_three" do 
    response_double = 'This is a different string' 
    thing = class_double("Thing", :method_three => response_double).as_stubbed_const 

    response = thing.method_one('Hi') 
    expect(response).to eq(response_double) 
end 

我得到的錯誤:

RSpec::Mocks::MockExpectationError: #<ClassDouble(Thing) (anonymous)> received unexpected message :method_one with ("Hi") 

是我想要做的事嗎?感覺就像我錯過了一個明顯的步驟,但儘管我盡了最大的努力,但我一直無法找到一個這樣的例子或一個問題,要求任何可比較的問題。

(注:如果是重要的,這不是一個Rails項目。)

回答

1

您可能需要使用的RSpec的allow(...)存根中間方法。這對測試邏輯流程或模擬測試中的第三方服務也很有用。

例如: expected_response = 'This is a different string' allow(Thing).to receive(:method_three).and_return(expected_response)

然後expect(Thing.method_one('Hi')).to eq(expected_response)應該通過。

有關存根方法的更多信息,請參閱https://relishapp.com/rspec/rspec-mocks/v/2-14/docs/method-stubs

+0

完美!我使用它來模擬來自第三方API的響應。由於我的'.method_three'實際上會返回一個法拉第連接,然後我調用另一個方法,所以我需要使用'receive_message_chain'。 我的實際代碼是這樣的(這可能有助於未來的一些Google員工): 'allow(FaradayConnection).to receive_message_chain(:connection,:get).and_return(expected_faraday_response)'。 – tjukes