2013-08-21 18 views
18

Làm cách nào tôi có thể chỉ gửi phương thức trên cuộc gọi đầu tiên và phương thức thứ hai sẽ hoạt động như mong đợi?phương pháp gốc chỉ trên cuộc gọi đầu tiên với Rspec

tôi có phương pháp sau đây:

def method 
    do_stuff 
rescue => MyException 
    sleep rand 
    retry 
end 

Tôi muốn cuộc gọi đầu tiên của do_stuff nâng MyException, nhưng trong cuộc gọi thứ hai, cư xử bình thường. Tôi cần phải đạt được điều này để kiểm tra khối rescue của tôi mà không nhận được một vòng lặp vô hạn.

Có cách nào để đạt được điều này không?

Trả lời

15

Bạn có thể chuyển một khối tới một nhánh sẽ được gọi khi lệnh được gọi. Sau đó bạn có thể thực hiện unstub trong đó, ngoài việc làm bất cứ điều gì bạn cần.

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 

Dường như hoạt động tốt ở đây.

$ rspec stub.rb -f doc 

Stub once 
    should only stub once 

Finished in 0.00058 seconds 
1 example, 0 failures 

Cách khác, bạn chỉ có thể theo dõi số lượng cuộc gọi và trả về kết quả khác nhau cho các cuống phiếu dựa vào số lượng cuộc gọi:

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

này giải quyết một vấn đề tôi chạy vào với tính năng chỉ đọc ActiveRecord của - tôi đã có một mô hình được đánh dấu chỉ đọc ('def readonly; true; end') nhưng cần thiết để tạo các cá thể trong một thử nghiệm và không muốn mã kiểm tra mux với mã sản xuất. Giải pháp (trong một factory_girl factory): 'after (: build) do | f | f.stub (: readonly?) {f.unstub (: chỉ đọc?); sai }; f.save !; kết thúc' –

Các vấn đề liên quan