【问题标题】:Does Minitest have something similar to allow_any_instance_of from RSpec?Minitest 是否有类似于 RSpec 中的 allow_any_instance_of 的东西?
【发布时间】:2020-10-07 08:32:15
【问题描述】:

来自Docs

rspec-mocks 提供了两种方法,allow_any_instance_ofexpect_any_instance_of,这将允许您存根或模拟任何 一个类的实例。它们用于代替 allow 或 expect:

allow_any_instance_of(Widget).to receive(:name).and_return("Wibble")

是否有与此功能相近的功能来模拟具有Minitest 的所有类实例的方法?

【问题讨论】:

    标签: ruby rspec minitest


    【解决方案1】:

    根据 Minitest 文档,您只能模拟单个实例。

    https://github.com/seattlerb/minitest#mocks-

    没有看到整个代码很难判断,但可能是您的架构可以改进。例如,您可以使用依赖注入来避免allow_any_instance_of,并使您的类更具可扩展性。

    而不是做

    class Foo
      def initialize
        @widget = Widget.new
      end
    
      def name
        widget.name
      end
    end
    

    并在你的测试中做

    it "does expect name" do
      allow_any_instance_of(Widget).to receive(:name).and_return("Wibble")
    
      Foo.new.name
    end
    

    你可以像这样注入小部件类

    class Foo
      def initialize(widget_class = Widget)
        @widget = widget_class.new
      end
    
      def name
        widget.name
      end
    end
    

    在你的规范中

    it "does expect name" do
      widget = double()
      widget.stub(:name) { 'a name' }
    
      foo = Foo.new(widget)
    
      expect(foo.name).to eq('a name')
    end
    

    代码现在遵循开闭原则,扩展性更强。但是如果这对您来说是一个可行的解决方案,那么如果不查看您的代码就很难判断。

    https://sourcediving.com/testing-external-dependencies-using-dependency-injection-ad06496d8cb6https://sourcediving.com/testing-external-dependencies-using-dependency-injection-ad06496d8cb6的博客文章中对此进行了总结

    【讨论】:

    • 谢谢!在这个问题中,我不是在寻找特定项目的实际解决方案,因此实际上没有代码可以共享,也没有架构可以改进。示例不是我的,它来自 RSpec 文档。
    • 好吧,我认为我的回答仍然有效,而且通常如果你发现很难测试某些东西(比如存根任何实例),最好退后一步想想你的程序是否具有最好的架构。在我的回答中,我概述了一种可能的解决方案,使您的程序更具可测试性。
    • 根本没有程序,测试也没有问题。问题是关于两个测试框架的比较。在 RSpec 和 Mocha 中都可以使用这种类型的刺伤,并且在某些情况下非常方便。
    【解决方案2】:

    一年后,我找到了这个问题的详细答案:minitest中没有这个功能,here是为什么:

    1. 它不符合 Minispec 作者的愿景
    2. 在某些情况下,它可能会破坏stub 的行为。

    但是有一个gem 为块的范围添加了stub_any_instance。该 gem 也在 Minitest 的Known Extensions 中列出。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 2011-01-07
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多