如何模拟Ruby模块功能?

时间:2012-07-05 21:50:04

标签: ruby module rspec mocking

如何在项目中模拟自编写模块的模块功能?

给出模块和功能

module ModuleA::ModuleB
  def self.my_function( arg )
  end
end

被称为

ModuleA::ModuleB::my_function( with_args )

当我在为我编写规范的函数中使用它时,我应该如何模拟它?


加倍(obj = double("ModuleA::ModuleB"))对我来说没有意义,因为函数是在模块上调用而不是在对象上调用。

我已经尝试过它(ModuleA::ModuleB.stub(:my_function).with(arg).and_return(something))。显然,它没有用。那里没有定义stub

然后我用should_receive尝试过。再次NoMethodError

模拟模块及其功能的首选方法是什么?

2 个答案:

答案 0 :(得分:11)

给出您在问题中描述的模块

module ModuleA ; end

module ModuleA::ModuleB
  def self.my_function( arg )
  end
end

和被测函数,它调用模块函数

def foo(arg)
  ModuleA::ModuleB.my_function(arg)
end

然后您可以测试foo调用myfunction,如下所示:

describe :foo do
  it "should delegate to myfunction" do
    arg = mock 'arg'
    result = mock 'result'
    ModuleA::ModuleB.should_receive(:my_function).with(arg).and_return(result)
    foo(arg).should == result
  end
end

答案 1 :(得分:0)

对于rspec 3.6,请参阅How to mock class method in RSpec expect syntax?

为了避免仅链接答案,这里是Andrey Deineko的答案副本:

allow(Module)
  .to receive(:profile)
  .with("token")
  .and_return({"name" => "Hello", "id" => "14314141", "email" => "hello@me.com"})