像這樣的東西應該工作:
it 'call methods in order' do
@method_calls = []
allow(@instance).to receive(:foo) do
@method_calls << :foo
end
allow(@instance).to receive(:bar) do
@method_calls << :bar
end
...
expect(@method_calls).to eq([:foo, :bar, :foo, :bar, :foo, :bar])
end
這裏有一個最小的測試,我想這說明了這一點充分:
require "rspec"
class MyClass
def bar
end
def foo
end
def foobar
foo
bar
foo
bar
foo
bar
end
end
describe "Foo" do
describe "#foobar" do
let(:instance) { MyClass.new }
it "alternately calls foo/bar" do
@method_calls = []
allow(instance).to receive(:foo) do
@method_calls << :foo
end
allow(instance).to receive(:bar) do
@method_calls << :bar
end
instance.foobar
expect(@method_calls).to eq([:foo, :bar, :foo, :bar, :foo, :bar])
end
end
end
運行此規範通過,但刪除(說)的方法之一調用foobar
方法會導致此錯誤:
F
Failures:
1) Foo #foobar alternately calls foo/bar
Failure/Error: expect(@method_calls).to eq([:foo, :bar, :foo, :bar, :foo, :bar])
expected: [:foo, :bar, :foo, :bar, :foo, :bar]
got: [:bar, :foo, :bar, :foo, :bar]
(compared using ==)
Diff:
@@ -1,2 +1,2 @@
-[:foo, :bar, :foo, :bar, :foo, :bar]
+[:bar, :foo, :bar, :foo, :bar]
# ./rspec_test.rb:38:in `block (3 levels) in <top (required)>'
Finished in 0.01517 seconds (files took 0.07714 seconds to load)
1 example, 1 failure
Failed examples:
rspec ./rspec_test.rb:25 # Foo #foobar alternately calls foo/bar
Hope這就說得通了。
工作完美...我有類似的東西,但是增加了一個塊到'expect'調用,而不是'allow'調用.... wonderul謝謝你! – brewster
很高興工作!我在一篇關於在rspec中嘲笑相互依賴關係的文章中提出了這個想法,以防你感興趣:http://tech.degica.com/en/2015/03/06/mocking-with-interdependency-in-rspec/ –