2010-09-01 44 views
7

Tôi muốn thử nghiệm một phương thức được gọi là đệ quy với một đối số cụ thể.Rspec: Làm thế nào để kiểm tra đệ quy?

cách tiếp cận của tôi:

class Recursable 
    def rec(arg) 
    rec(7) unless arg == 7 
    end 
end 

describe Recursable do 
    it "should recurse" do 
    r = Recursable.new('test') 
    r.should_receive(:rec).with(0).ordered 
    r.should_receive(:rec).with(7).ordered 
    r.rec(0) 
    end 
end 

Thật bất ngờ, RSpec không thành công với:

expected :rec with (7) once, but received it 0 times 

Bất cứ ý tưởng gì sai với cách tiếp cận của tôi? Làm thế nào để kiểm tra đệ quy hiệu quả với một đối số cụ thể?

Trả lời

10

Sự cố với thử nghiệm của bạn vì hiện tại bạn đang phân phát phương pháp bạn đang thử nghiệm. r.should_receive(:rec) đang thay thế r#rec bằng cuống, tất nhiên không bao giờ gọi r.rec(7).

Cách tiếp cận tốt hơn là chỉ cần kiểm tra kết quả của cuộc gọi phương thức ban đầu là chính xác. Nó không phải là vấn đề nghiêm túc hay không phương pháp đệ quy, lặp lại, hoặc điện thoại một người bạn, miễn là nó cung cấp cho các câu trả lời đúng cuối cùng.

+0

Ah, được rồi. Ồ, tốt! Tôi đang cố gắng để tìm một lỗi - phương pháp không trả về một giá trị sai (nó là phức tạp hơn so với mô tả ở đây). Tôi nghĩ tôi có thể kiểm tra từng phần của nó để thu hẹp không gian vấn đề. Nó trở nên phức tạp hơn với mỗi cấp độ đệ quy và nó sẽ được tốt đẹp để kiểm tra xem các đệ quy được thực hiện một cách chính xác. – crispy

+2

Nói cách khác: Không kiểm tra việc triển khai, kiểm tra hiệu ứng của mã. Câu trả lời chính xác! – awendt

2

Thường thì nếu bạn cần kiểm tra đệ quy thì đó là một mã nguồn; bạn có lẽ nên chia phương pháp thành các trách nhiệm khác nhau hoặc một cái gì đó.

Nhưng đôi khi bạn chỉ cần thêm một số kiểm tra cơ bản về đệ quy của mình. Bạn có thể làm điều đó với RSpec and_call_original:

it "should recurse" do 
    r = Recursable.new('test') 
    r.should_receive(:rec).with(0).ordered.and_call_original 
    r.should_receive(:rec).with(7).ordered.and_call_original 
    r.rec(0) 
end 

thường should_receive sẽ chỉ còn sơ khai phương pháp thực tế, đó là lý do tại sao các đệ quy không hoạt động. Với and_call_original phương thức stubbed (có chứa các kiểm tra kiểm tra) cũng sẽ gọi phương thức triển khai thực hiện ban đầu, sẽ thực hiện đệ quy như mong đợi.

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