2011-08-26 33 views
12

Tôi muốn kiểm tra xem phương thức được gọi chính xác (n) lần, nhưng Tôi vẫn muốn phương thức đó thực hiện chức năng ban đầu của nó. Hãy xem xét một hệ thống thu nhỏ đơn giản lưu trữ tệp hình thu nhỏ và đảm bảo tệp thực thi "chuyển đổi" của ImageMagick tạo hình thu nhỏ chỉ được gọi theo yêu cầu đầu tiên.rspec 2: phát hiện cuộc gọi đến phương thức nhưng vẫn thực hiện chức năng của nó

it "this passes: should detect a cached version" do 
    thumbnail_url = thumbnail_url_for("images/something.jpg") 
    get thumbnail_url 
    last_response.should be_ok 
    Sinatra::Thumbnail.should_not_receive(:convert) 
    get thumbnail_url 
    last_response.should be_ok 
    end 

    it "this fails: should detect a cached version" do 
    Sinatra::Thumbnail.should_receive(:convert).exactly(1).times 
    thumbnail_url = thumbnail_url_for("images/something.jpg") 
    get thumbnail_url 
    last_response.should be_ok 
    get thumbnail_url 
    last_response.should be_ok 
end 

Trong trường hợp của tôi, tôi có được nỗ lực đầu tiên, nhưng có thể có trường hợp không. Cái thứ hai thất bại vì cuộc gọi Thumbnail.convert được phát hiện nhưng chính phương thức đó không làm bất cứ điều gì. Có cách nào để chỉ phát hiện các cuộc gọi đến phương pháp và có nó làm điều đó ban đầu?

BTW: Tôi nghi ngờ điều này question là rất giống nhau, nhưng sau đó tôi bị lạc trong mô tả và cũng chưa có ai trả nó ...

Trả lời

20

Bây giờ có một phương pháp and_call_original chính xác đối với trường hợp sử dụng này. (RSpec 2.12)

Sinatra::Thumbnails.should_receive(:convert).and_call_original 

Tài liệu có thể được tìm thấy trên cùng một trang được tham chiếu bởi Joao, here.

Xem thêm: các changelog

+0

Cảm ơn, đã làm việc như một sự quyến rũ! – thomax

15

Yay! Tôi nghĩ rằng tôi đã tìm ra!

it "should detect a cached version" do 
    original_method = Sinatra::Thumbnails.method(:convert) 
    Sinatra::Thumbnails.should_receive(:convert).exactly(1).times do |*args| 
    original_method.call(*args) 
    end 
    thumbnail_url = thumbnail_url_for("images/something.jpg") # 
    get thumbnail_url 
    last_response.should be_ok 
    get thumbnail_url 
    last_response.should be_ok 
end 

Nó là tài liệu (kém, theo ý kiến ​​của tôi) trong here vào cuối ...

+0

tài liệu thực sự nghèo, và tôi không thể tìm thấy bất kỳ đề cập của 'original_method' trong trang web mà bạn chỉ ra. Nhưng cảm ơn câu trả lời! – lulalala

+0

'original_method' chỉ là biến cục bộ mà tôi đã sử dụng! Trang tôi đã liên kết để đề cập đến "xử lý tùy ý", đó là những gì tôi cần để gọi phương thức được lưu trữ trong biến cục bộ đó. –

+0

tôi đang nghĩ gì? Xin lỗi tôi đã không đọc nó đúng cách: ( – lulalala

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