mocking - Minitest 如何解决模拟方法:调用需要 0 个参数,得到 1

我有一个调用方法来存根的服务。但它总是有这个错误:

SomeTest#test_1:
ArgumentError: mocked method :call expects 0 arguments, got 1
    test.rb:17:in `block in test_1'
    test.rb:16:in `test_1'

这是代码:

require 'minitest/autorun'

class SomeService
  def initialize(headers = {})
  end

  def call
  end
end

class SomeTest < Minitest::Test
  def test_1
    mock = Minitest::Mock.new
    mock.expect :call, nil

    SomeService.stub :new, mock do
      SomeService.new({}).call
    end
  end
end

我做错了什么?谢谢

回答1

一般来说,您写的内容是正确的,但是您使用方法名称 call 遇到了问题。

正如您在 https://www.rubydoc.info/gems/minitest/4.2.0/Object:stub 方法的文档中看到的那样。

“如果 val_or_callable 响应 #call,那么它返回调用它的结果”。

所以基本上问题是你的模拟响应callstub方法在进入块之前调用它。您可以通过将模拟包装在丢弃参数的 lambda 中来解决它。

require 'minitest/autorun'

class SomeService
  def initialize(headers = {})
  end

  def call
  end
end

class SomeTest < Minitest::Test
  def test_1
    mock = Minitest::Mock.new
    mock.expect :call, nil

    SomeService.stub :new, ->(_args) { mock } do
      SomeService.new({}).call
    end
  end
end

相似文章

随机推荐

最新文章