web-dev-qa-db-ja.com

特定のメソッドをアサートする方法はRubyミニテストフレームワークで呼び出されますか?

関数が他の関数をミニテスト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
29
steveyang

Minitestでは、expectメソッドを使用して、モックオブジェクトで呼び出されるメソッドの期待値を設定します。

obj = MiniTest::Mock.new
obj.expect :right

パラメータと戻り値で期待値を設定する場合は、次のようにします。

obj.expect :right, return_value, parameters

そしてそのような具体的なオブジェクトのために:

obj = SomeClass.new
assert_send([obj, :right, *parameters])
24
nas

ミニテストには特別な.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

15
jvalanen

与えられた例によれば、他のデリゲートクラスはなく、メソッドが同じクラスから適切に呼び出されることを確認したいとします。次に、以下のコードスニペットが機能します。

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
3
Jing Li