Как издеваться над функциями модуля Ruby?

Как я могу фальсифицировать функции модуля самонаписанного модуля внутри моего проекта?

Учитывая модуль и функцию

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.

Каков предпочтительный способ издеваться над модулем и он функционирует?

Ответ 1

Учитывая модуль, который вы описываете в своем вопросе

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