2012-05-01 38 views
1

我無法模擬注入的對象。例如:Rspec:模擬嵌套/依賴項注入對象

class Foo 
    def initialize(bar = Bar.new) 
    @bar = bar 
    end 

    def run 
    @bar.do_something_cool 
    end 
end 

# Rspec 
describe Foo do 
    it "should do something cool" do 
    mock_bar = mock("bar") 
    mock_bar.stub(:do_something_cool).and_return(nil) 

    real_foo = Foo.new(mock_bar) 
    real_foo.run 

    mock_bar.should_receive(:do_something_cool).once 
    end 
end 

如果我運行這個,規範失敗,因爲它說「do_something_cool」永遠不會被調用。

expected: 1 time 
received: 0 times 

但是,如果我不存根 「do_something_cool」,我得到以下錯誤

Mock "bar" received unexpected message :do_something_cool with (no args) 

任何想法?

回答

4
mock_bar.should_receive(:do_something_cool).once 

前應

real_foo.run 
+0

哦,謝謝!像魅力一樣工作! – Terenced

+0

太棒了!愉快的RSpecing。 :) –

+0

我一直希望RSpec的DSL可以讓模擬對象以稍微少一些的前後方式使用,例如:'expect {some_code} .to調用(mock,:do_something_cool).once' – d11wtq