How to mock Ruby Module functions?

mocking, module, rspec, ruby

Solution

Given the module you describe in your question

module ModuleA ; end

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

and the function under test, which calls the module function

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

then you can test that `foo` calls `myfunction` like this:

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

Problem

How can I mock module functions of a self-written module inside my project? Given the module and function ``` module ModuleA::ModuleB def self.my_function( arg ) end end ``` which is called like ``` ModuleA::ModuleB::my_function( with_args ) ``` How should I mock it when it's used inside a function I'm writing specs for? Doubling it (`obj = double("ModuleA::ModuleB")`) makes no sense for me as the function is called on the module and not on an object. I've tried stubbing it (`ModuleA::ModuleB.stub(:my_function).with(arg).and_return(something)`). Obviously, it did not work. `stub` is not defined there. Then I've tried it with `should_receive`. Again `NoMethodError`. What is the preferred way of mocking a module and it's functions?

Original source

Related problems