2017-03-22 3 views
1

大きなフレームワークの一部を書いていますが、スタブに問題があります。ここで私はMinitestでテストしたクラスのメソッドをスタブする

class A 
    def bar 
     # some code 
     foo 
     # some code 
    end 
    def foo 
     # method dependent on other parts of the framework 
    end 
end 

は、今私はメソッドバーをテストしたい持っているものですが、それはFOOに依存し、fooが(より多くの統合テストの問題である)フレームワークの他の部分を呼び出します。私は何をしたいのは、私のテストでのようなものFOOをスタブすることです:

class TestA < Minitest::Test 
    def stubbed_foo 
     return 5 
    end 
    def test_bar 
     a = A.new 
     # use stubbed_foo in a instead of foo 
     result = a.bar 
     # some assert 
    end 
end 

をしかし、私はどのように行うのか分かりません。私は私が正しく理解していれば、あなたがMiniTest::Object#stubここ

def test_bar 
    a = A.new 
    # use stubbed_foo in a instead of foo 
    a.stub :foo, 5 do 
     result = a.bar 
     # some assert 
    end 
end 

を探していると思う

答えて

1

は完全な例である:

require 'minitest/autorun' 

class A 
    def bar 
     foo + 1 
    end 
    def foo 
     3 
    end 
end 

class TestA < MiniTest::Unit::TestCase 

    def test_bar 
     a = A.new 
     a.stub :foo, 5 do 
      result = a.bar 
      assert_equal(6,result) 
     end 
    end 

    def test_actual_bar 
    a = A.new 
    result = a.bar 
    assert_equal(4,result) 
    end 
end 

アップデート:コメントに基づいて、複数の値に

を返す方法
class A 
    def bar 
    foo + 1 
    end 
    def foo 
    3 
    end 
end 

class TestA < MiniTest::Unit::TestCase 

    def test_bar 
    a = A.new 
    stubbed_foo = [5,7].to_enum 
    a.stub :foo, ->{stubbed_foo.next} do 
     assert_equal(6,a.bar) 
     assert_equal(8,a.bar) 
    end 
    end 

    def test_actual_bar 
    a = A.new 
    assert_equal(4,a.bar) 
    end 
end 
+0

これはまさに私が 探している。今度はbarがfooを2回呼び出すと、すべての呼び出しでスタブが異なる値を返すようにしたいのですが?例えば。それをスタブするので、fooの最初の呼び出しで5を返し、2番目の呼び出しで7を返します。 –

+1

@VáclavPruner更新を参照してください。期待値を返すには、呼び出し可能なオブジェクトが必要です。このケースでは、リクエストを処理するために 'lambda'と' Enumerator#next'を使いました – engineersmnky

関連する問題