2016-09-19 15 views
3

私は再帰的メソッドを持っています。メソッド呼び出しの順序をテストする必要があります。私が持っている問題は、これらのメソッドは代替を呼び出します。例えば...注文とx回の両方でrspecモックをテストするにはどうすればよいですか?

it 'call methods in order' do 
    expect(@instance).to have_received(:foo).ordered 
    expect(@instance).to have_received(:bar).ordered 
    expect(@instance).to have_received(:foo).ordered 
    expect(@instance).to have_received(:bar).ordered 
    expect(@instance).to have_received(:foo).ordered 
    expect(@instance).to have_received(:bar).ordered 
end 

expected: 1 time with any arguments 
received: 3 times with any arguments 

foobarで3回が正しいと呼ばれているので、これは失敗しますが、どのように私は、交互にそれらをテストするのですか?

答えて

0

何か:

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 

にはパスするが、(例えば)メソッドの1つを取り外し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 

希望それは理にかなっている。

+0

は完璧に動作しました...私は何か似ていましたが、 'expect'コールにブロックを追加しました。' allow'コールではありません.... wonderulありがとう! – brewster

+0

うれしかった!私は興味がある場合に備えて、rspecの相互依存性を嘲笑することについて書いた記事に基づいています。http://tech.degica.com/en/2015/03/06/mocking-with-interdependency-in-rspec/ –

0

メソッドの再帰的な部分をカプセル化し、他のすべてをスタブし、ブラックボックスアプローチ(つまり入力 - >出力)でそのメソッドをテストする必要があります。この動作するはずのような

+0

私は従っていません...あなたは精緻化/例を表示できますか? – brewster

関連する問題