Как издеваться над функциями модуля 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
Ответ 2
Для rspec 3.6 см. Как высмеять метод класса в синтаксисе RSpec ожидать?
Чтобы избежать ссылки-только-ответа, вот копия ответа Андрея Дейнеко:
allow(Module)
.to receive(:profile)
.with("token")
.and_return({"name" => "Hello", "id" => "14314141", "email" => "[email protected]"})