2012-11-19 64 views
1

如何使用Rspec模擬推入類數組變量?下面是一個過於簡單化的例子:如何使用Rspec模擬陣列推

class Foo 
    attr_accessor :bar 
    def initialize 
    @bar = [] 
    end 
end 

def some_method(foo) 
    foo.bar << "a" 
end 

說我想寫some_method,「應當推動一個新的價值吧」一個規範。我怎麼做?

foo = Foo.new 
foo.should_receive(WHAT GOES HERE???).with("a") 
some_method(foo) 

回答

3

爲什麼要嘲笑什麼?你只需要模擬一些東西,當它試圖從你實際嘗試測試的東西中分離出來時。在你的情況,你似乎在試圖驗證調用some_method結果將項目添加到您傳遞的對象的屬性,你可以簡單地直接測試它:

foo = Foo.new 
some_method(foo) 
foo.bar.should == ["a"] 

foo2 = Foo.new 
foo2.bar = ["z", "q"] 
some_method(foo2) 
foo2.bar.should == ["z", "q", "a"] 

# TODO: Cover situation when foo.bar is nil since it is available as attr_accessor 
# and can be set from outside of the instance 

*修改之後的評論下面* *從文檔

foo = Foo.new 
bar = mock 
foo.should_receive(:bar).and_return bar 
bar.should_receive(:<<).with("a") 
some_method(foo) 
+0

是啊,對不起,我可能有過度簡化了我的例子。我的真實代碼中存在對外部類的依賴。雖然答案很好。 – Lynn

+0

這也適用於爲has_and_belongs_to_many(HABTM)關聯存根(並設定期望值)。謝謝:) –

2

例子: http://rubydoc.info/gems/rspec-mocks/frames

double.should_receive(:<<).with("illegal value").once.and_raise(ArgumentError) 
+0

所以在Lynn的例子中,它將是'foo.should_receive(:<<)。with(「a」)' –

+0

@PrakashMurthy:在這種情況下,雖然foo沒有收到<<,bar是。 – Lynn