2012-07-05 3 views
11

Wie kann ich Modulfunktionen eines selbstgeschriebenen Moduls in meinem Projekt vortäuschen?Wie Ruby-Modul-Funktionen mockten?

das Modul und Funktion Bei

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

die wie

ModuleA::ModuleB::my_function(with_args) 

Wie soll ich es verspotten genannt wird, wenn es in einer Funktion verwendet wird I Spezifikationen für mich schreiben?


es Verdoppeln (obj = double("ModuleA::ModuleB")) macht keinen Sinn für mich, da die Funktion auf dem Modul aufgerufen wird und nicht auf ein Objekt.

Ich habe versucht es stubbing (ModuleA::ModuleB.stub(:my_function).with(arg).and_return(something)). Offensichtlich hat es nicht funktioniert. stub ist dort nicht definiert.

Dann habe ich es mit should_receive versucht. Wieder NoMethodError.

Was ist die bevorzugte Art, ein Modul und seine Funktionen zu verspotten?

Antwort

11

das Modul, das Sie in Ihrer Frage Gegeben

module ModuleA ; end 

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

und die Funktion im Test beschreiben, die die Modulfunktion

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

dann können Sie diesen Test testen Anrufe, die foo Anrufe myfunction wie folgt aus:

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

, die im Grunde ist, was ich versuchte. Danke für die Nachbearbeitung. Mein Problem war jedoch, dass ich das 'sollte_receive' in einen' before: all'-Block schreiben sollte. Offensichtlich funktioniert das nicht. Wie dumm von mir. –

+0

@Torbjoern, Oh ja. War dort. Freut mich, dass es geklappt hat. –

+0

In der aktuellen rspec (3.6) gibt es "Using' sent_receive "aus rspec-mocks 'old': sollte' Syntax ohne explizite Aktivierung der Syntax ist veraltet. Verwenden Sie die neue ': expect' Syntax oder aktivieren Sie explizit': should'. " –