如何使用 Mocha 在控制器中存根模块方法

Posted

技术标签:

【中文标题】如何使用 Mocha 在控制器中存根模块方法【英文标题】:How to stub a module method inside a controller with Mocha 【发布时间】:2019-04-08 03:03:36 【问题描述】:

我有一个这样的 Sinatra 应用程序:

my_module.rb

module MyModule
  def my_method
    "yay"
  end
end

app.rb

get "/my_module" do 
  puts my_method
end

我正在尝试使用Minitestmochamy_method 进行存根测试。

def test_my_method
  MyModule.stubs(:my_method).returns("stubbed")
  get "/my_module"
end

但这似乎不起作用,因为仍然调用了原始方法。关于如何做到这一点的任何想法?谢谢!

【问题讨论】:

【参考方案1】:

我发现了两种不同的方法来实现这一点。

1) 使用stub any instance gem。

有了这个 gem,我可以存根 Sinatra::Application 的任何实例。所以解决方案是这样的:

def test_my_method
  Sinatra::Application.stub_any_instance(:my_method, "stubbed") do
    get "/my_module"
    # => stubbed
  end
end

2) 使用mocha 的any_instance。

此解决方案遵循相同的原则。只需使用mochas 方法。

def test_my_method
  Sinatra::Application.any_instance.stubs(:my_method).returns("stubbed")
  get "/my_module"
  # => stubbed
end

【讨论】:

以上是关于如何使用 Mocha 在控制器中存根模块方法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mocha / Jasmine 在控制器方法中为 if else 案例获得 Karma 覆盖?

轻松清理 sinon 存根

如何正确地在 mocha.opts 中需要一个模块?

如何使用 Jest 和 Proxyquire 存根模块?

如何存根/注入视图控制器以在 iOS 5 运行时进行基于状态的测试?

您如何安装和运行 Mocha,Node.js 测试模块?安装后获取“mocha:找不到命令”