2010-03-01 25 views
26

Tôi đang cố gắng gặp lỗi trong thử nghiệm rspec.Lỗi mong đợi trong các thử nghiệm rspec

lambda {Participant.create!({:user_id => three.id, :match_id => match.id, :team => 1})}.should raise_error StandardError 

Hiện tại tôi chỉ đang sử dụng StandardError để đảm bảo nó hoạt động.

1) StandardError in 'Participant should never allow more participants than players'. 
    This game is already full. Cannot add another player. 
/home/josiah/Projects/Set-Match/app/models/participant.rb:12:in `do_not_exceed_player_count_in_match' 
./spec/models/participant_spec.rb:24: 

Nó rõ ràng đã ném lỗi, nhưng thử nghiệm của tôi vẫn không thành công.

Suy nghĩ?

Trả lời

34

Cú pháp của bạn có vẻ chính xác. Để gỡ lỗi này, đơn giản hóa để đảm bảo thông số kỹ thuật của bạn được mã hóa chính xác.

it "should raise an error" do 
    lambda {raise "boom"}.should raise_error 
end 

Sau đó thêm chi tiết khác cho đến khi nó ngắt.

lambda {raise "boom"}.should raise_error(RuntimeError) 
lambda {raise StandardError.new("boom")}.should raise_error(StandardError) 
+0

Thanks for the tip. –

5

Tôi phải đấu tranh với các triệu chứng giống nhau:

def boom 
    raise "boom" 
end 
boom.should raise_error 

Thử nghiệm trên thất bại vì raise_error đòi hỏi should được kêu gọi một Proc (do lý do kỹ thuật, tôi giả sử). Vì vậy, gói một cuộc gọi phương thức với một lambda hoạt động tốt:

lambda { boom }.should raise_error 

Thật không may, tài liệu không nói rõ ràng và không có ngoại lệ RSpec cho thấy hành vi này. Có một số two year old ticket cho điều đó.

+2

"boom.should raise_error" thất bại vì bùng nổ được đánh giá ngay trước khi thực hiện "nên"; lambda, mặt khác, được gọi là "nên" chính nó. – grilix

45

Kể từ khi một thời gian, nhưng ít nhất trong RSpec 2.5, nó có thể sử dụng

expect {raise 'boom'}.to raise_error(RuntimeError, /boom/) 
Các vấn đề liên quan