2010-08-11 29 views
37

Tôi muốn thử nghiệm một chức năng trên một trong các mô hình của tôi có các lỗi cụ thể. Chức năng trông giống như thế này:Rails ActiveSupport: Làm thế nào để khẳng định rằng lỗi được nâng lên?

def merge(release_to_delete) 
    raise "Can't merge a release with itself!" if(self.id == release_to_delete.id) 
    raise "Can only merge releases by the same artist" if(self.artist != release_to_delete.artist ) 
    #actual merge code here 
end 

Bây giờ tôi muốn khẳng định rằng khi tôi gọi hàm này với tham số gây ra mỗi ngoại lệ, ngoại lệ thực sự bị ném. Tôi đã xem tài liệu ActiveSupport, nhưng tôi đã không tìm thấy bất cứ điều gì hứa hẹn. Bất kỳ ý tưởng?

Trả lời

85

Vì vậy, kiểm tra đơn vị không thực sự hoạt động. Ruby đi kèm với một khung xunit điển hình trong libs chuẩn (Test :: Unit trong ruby ​​1.8.x, MiniTest trong ruby ​​1.9), và các công cụ trong activesupport chỉ thêm một số thứ vào nó.

Nếu bạn đang sử dụng Test :: Đơn vị/MiniTest

assert_raises(Exception) { whatever.merge } 

nếu bạn đang sử dụng rspec (tiếc là kém tài liệu, nhưng cách phổ biến hơn)

lambda { whatever.merge }.should raise_error 

Nếu bạn muốn kiểm tra số được nâng lên Exception:

exception = assert_raises(Exception) { whatever.merge } 
assert_equal("message", exception.message) 
+7

Cảm ơn! Tôi đã phải sử dụng "RuntimeError" thay vì ngoại lệ, như thế này: assert_raise (RuntimeError) {artist1.merge (artist1)} Hướng dẫn này cực kỳ hữu ích: http://guides.rubyonrails.org/testing.html – spilliton

+1

@spilliton: Thats vì trình thông dịch Ruby xử lý mã ở trên là 'assert_raise (Exception() {whatever.merge})', tức là nó tìm kiếm một phương thức gọi là 'Exception' được gọi với khối đã cho. Việc thêm dấu ngoặc đơn sẽ giải quyết sự mơ hồ đó. (Đã sửa câu trả lời) –

+0

Trong rspec 3, sử dụng 'expect {whatever.merge}. To raise_error' (http://www.relishapp.com/rspec/rspec-expectations/v/3-1/docs/built- in-matchers/raise-error-matcher) –

9

Để đảm bảo rằng không có ngoại lệ xảy ra (hoặc được xử lý thành công) làm bên trong trường hợp thử nghiệm của bạn:

assert_nothing_raised RuntimeError do 
     whatever.merge 
    end 

Để kiểm tra lỗi mà được nâng lên làm bên trong trường hợp thử nghiệm của bạn:

assert_raise RuntimeError do 
     whatever.merge 
    end 

Ừ .. của nó đơn giản vậy thôi! :)

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