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

How to stub a module method inside a controller with Mocha

我有一个这样的 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) 使用 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) 使用 mochaany_instance.

这个解决方案遵循同样的原则。仅使用 mochas 方法。

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