2012-07-05 100 views
11

如何在我的项目中模拟自写模块的模块功能?如何模拟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

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

回答

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

这基本上,我的尝试。感谢您的总结。然而,我的问题是,我把'should_receive'放在'before:all'块中。显然这是行不通的。我多么愚蠢。 – 2012-07-06 06:41:40

+0

@Torbjoern,噢。到过那里。很高兴你能解决问题。 – 2012-07-06 12:45:37

+0

在当前的rspec(3.6)中,它提供了使用rspec-mocks旧':should'语法中的'should_receive'而不明确地启用语法的方法,不推荐使用新的':expect'语法或显式启用':should'。 “ – 2017-06-06 10:03:40