ruby 使用Minitest存根多个类方法的最佳方法是什么?

w41d8nur  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(89)

我使用Ruby3.2.2和Rails7.0.5
我正在编写一个单元测试的一些代码,同时模仿/stubbing一个使用各种类方法的实用类。
它大致看起来像这样:

class MyUtilityClass
  def self.foo
    # Does something...
  end

  def self.bar
    # Does something else...
  end
end

class MyTestTarget
  def run_foo
    MyUtilityClass.foo
  end
end

字符串
我想测试一下,当我调用run_foo时,它会调用foo,但不会调用MyUtilityClass中的bar。因此,作为测试的一部分,我需要存根foobar
我知道如何像这样存根方法:

test 'calls foo' do
  mock_foo = Minitest::Mock.new
  mock_foo.expect :call, nil, []
  MyUtilityClass.stub :foo, mock_foo do
    t = MyTestTarget()
    t.run_foo
  end
  mock_foo.verify
end


测试bar()是否在此测试用例中被调用的最优雅/最佳实践方法是什么?

jrcvhitl

jrcvhitl1#

警告在最后。
所以,丑陋的回答你的实际问题,我相信Minitest::Mock的唯一方法是为你的:bar创建一个mock,然后Assert.verify确实引发了MockExpectationError
...但是对于你的基本问题,更好的答案是,笨拙的API和内置mocking中缺乏功能是为什么像mocha这样的gem存在的原因,我强烈建议即使只是为了这个用例也值得切换:

test 'calls foo not bar' do
  MyUtilityClass.expects(:foo).once
  MyUtilityClass.expects(:bar).never
  MyTestTarget.new.run_foo
end

字符串

警告

希望你知道测试那些还没有被称为的东西是多么的变化无常。例如,如果有人后来在foo中添加了对bar的调用,那么因为你在测试中模拟了foo,那么bar仍然不会被调用(在你的测试中),即使它在你的实际代码中被调用。

相关问题