2012-07-05 104 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