2012-07-05 14 views
11

Jak mogę sfałszować funkcje modułu samodzielnie napisanego modułu w moim projekcie?Jak wyśmiewać funkcje Ruby Module?

Biorąc moduł i funkcję

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

który nazywa się jak

ModuleA::ModuleB::my_function(with_args) 

Jak należy wyśmiewać go, gdy jest on używany wewnątrz funkcji piszę specyfikacje dla?


Podwojenie go (obj = double("ModuleA::ModuleB")) nie ma sensu dla mnie, jako funkcja nosi nazwę modułu, a nie na obiekcie.

Próbowałem stubbing to (ModuleA::ModuleB.stub(:my_function).with(arg).and_return(something)). Oczywiście to nie zadziałało. stub nie jest tam zdefiniowany.

Potem próbowałem go z should_receive. Ponownie NoMethodError.

Jaki jest preferowany sposób na kpiny z modułu i jego funkcji?

Odpowiedz

11

Biorąc moduł Państwo opisać swoje pytanie

module ModuleA ; end 

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

a funkcja badanego, które wywołuje funkcję modułu

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

następnie można przetestować ten test, który foo rozmowy myfunction tak:

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

To w zasadzie, co starałem. Dzięki za opakowanie. Mój problem polegał jednak na tym, że umieściłem 'should_receive' w bloku' before: all'. Oczywiście to nie działa. Ale jestem głupi. –

+0

@ Torbjoern, Oh yeah. Byłem tam. Cieszę się, że to się udało. –

+0

W bieżącym rspec (3.6) daje "Using' should_receive' ze starej składni ': should 'rspec-mocks bez wyraźnego włączenia składni jest przestarzałe. Użyj nowej składni': expect' lub jawnie włącz ': powinien" zamiast tego. " –

Powiązane problemy