関数が他の関数をミニテストRubyで正しく呼び出すかどうかをテストしたいのですが、 doc からテストする適切なassert
が見つかりません。
class SomeClass
def invoke_function(name)
name == "right" ? right () : wrong ()
end
def right
#...
end
def wrong
#...
end
end
describe SomeClass do
it "should invoke right function" do
# assert right() is called
end
it "should invoke other function" do
# assert wrong() is called
end
end
Minitestでは、expect
メソッドを使用して、モックオブジェクトで呼び出されるメソッドの期待値を設定します。
obj = MiniTest::Mock.new
obj.expect :right
パラメータと戻り値で期待値を設定する場合は、次のようにします。
obj.expect :right, return_value, parameters
そしてそのような具体的なオブジェクトのために:
obj = SomeClass.new
assert_send([obj, :right, *parameters])
ミニテストには特別な.expect :call
は、メソッドが呼び出されたかどうかを確認します。
describe SomeClass do
it "should invoke right function" do
mocked_method = MiniTest::Mock.new
mocked_method.expect :call, return_value, []
some_instance = SomeClass.new
some_instance.stub :right, mocked_method do
some_instance.invoke_function("right")
end
mocked_method.verify
end
end
残念ながら、この機能は十分に文書化されていません。私はそれについてここから見つけました: https://github.com/seattlerb/minitest/issues/216
与えられた例によれば、他のデリゲートクラスはなく、メソッドが同じクラスから適切に呼び出されることを確認したいとします。次に、以下のコードスニペットが機能します。
class SomeTest < Minitest::Test
def setup
@obj = SomeClass.new
end
def test_right_method_is_called
@obj.stub :right, true do
@obj.stub :wrong, false do
assert(@obj.invoke_function('right'))
end
end
end
def test_wrong_method_is_called
@obj.stub :right, false do
@obj.stub :wrong, true do
assert(@obj.invoke_function('other'))
end
end
end
end
アイデアは、単純なtrue値を返し、スタブブロックで[method_expect_to_be_called]をスタブすることです。実際に呼び出され、true値が返されることをアサートします。他の予期しないメソッドをスタブ化するには、それが呼び出されていないことを確認するだけです。
注:assert_sendは正しく機能しません。 公式ドキュメント を参照してください。
実際、以下のステートメントはパスしますが、期待どおりに機能しているという意味ではありません。
assert_send([obj, :invoke_function, 'right'])
# it's just calling invoke_function method, but not verifying any method is being called