11

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

给定模块和功能

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

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

4

2 回答 2

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
于 2012-07-06T00:49:08.237 回答
1

对于 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"})
于 2017-06-06T10:12:21.137 回答