2013-08-21 9 views
18

Jak mogę wywołać metodę tylko przy pierwszym wywołaniu, a w drugim powinien zachowywać się zgodnie z oczekiwaniami?metoda pośrednia tylko przy pierwszym połączeniu z Rspec

Mam następujący sposób:

def method 
    do_stuff 
rescue => MyException 
    sleep rand 
    retry 
end 

Chcę pierwszego wezwania do_stuff podnieść MyException, ale w drugim naborze, zachowuje się normalnie. Muszę to zrobić, aby przetestować mój blok rescue bez uzyskania nieskończonej pętli.

Czy istnieje sposób, aby to osiągnąć?

Odpowiedz

15

Możesz przekazać blok do kodu pośredniczącego, który będzie wywoływany po wywołaniu kodu pośredniczącego. Możesz wtedy wykonać unstub, robiąc to, co potrzebujesz.

class Foo 
    def initialize 
    @calls = 0 
    end 

    def be_persistent 
    begin 
     increment 
    rescue 
     retry 
    end 
    end 

    def increment 
    @calls += 1 
    end 
end 

describe "Stub once" do 
    let(:f) { Foo.new } 
    before { 
    f.stub(:increment) { f.unstub(:increment); raise "boom" } 
    } 

    it "should only stub once" do 
    f.be_persistent.should == 1 
    end 
end 

Wydaje się, że ładnie tutaj działa.

$ rspec stub.rb -f doc 

Stub once 
    should only stub once 

Finished in 0.00058 seconds 
1 example, 0 failures 

Alternatywnie, można po prostu śledzić liczbę połączeń i zwracać różne wyniki za odgałęzienie na podstawie liczby połączeń:

describe "Stub once" do 
    let(:f) { Foo.new } 

    it "should return different things when re-called" do 
    call_count = 0 
    f.should_receive(:increment).twice { 
     if (call_count += 1) == 1 
     raise "boom" 
     else 
     "success!" 
     end 
    } 

    f.be_persistent.should == "success!" 
    end 
end 
+0

ten rozwiązano problem wpadłem z tylko do odczytu funkcji ActiveRecord za - I miał model oznaczony jako readonly ('def readonly; true; end'), ale musiał utworzyć instancje w teście i nie chciał testować kodu MUX za pomocą kodu produkcyjnego. Rozwiązanie (w fabryce factory_girl): 'after (: build) do | f | f.stub (: readonly?) {f.unstub (: readonly?); fałszywe }; f.save !; koniec' –

Powiązane problemy