如何使用Ruby minitest框架调用某些方法?

ste*_*ang 27 ruby testing unit-testing minitest

我想测试一个函数是否使用minitest Ruby正确调用其他函数,但是我找不到适合assertdoc测试的函数.

源代码
class SomeClass
  def invoke_function(name)
    name == "right" ? right () : wrong ()
  end

  def right
    #...
  end

  def wrong
    #...
  end
end
Run Code Online (Sandbox Code Playgroud) 测试代码:
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
Run Code Online (Sandbox Code Playgroud)

nas*_*nas 24

使用minitest,您可以使用expect方法来设置在模拟对象上调用方法的期望

obj = MiniTest::Mock.new
obj.expect :right
Run Code Online (Sandbox Code Playgroud)

如果要使用参数设置期望值并返回值,则:

obj.expect :right, return_value, parameters
Run Code Online (Sandbox Code Playgroud)

对于像这样的具体对象:

obj = SomeClass.new
assert_send([obj, :right, *parameters])
Run Code Online (Sandbox Code Playgroud)

  • 对于具体的对象版本,使用`minitest/spec`时有`must_send` (2认同)

jva*_*nen 17

Minitest有一个特殊.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
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个功能没有很好地记录.我从这里找到了它:https://github.com/seattlerb/minitest/issues/216