2009-05-07 16 views
5

Tôi có một số bộ điều khiển trong ứng dụng Ruby on Rails với trình xử lý giải cứu vào cuối hành động cơ bản bắt được bất kỳ lỗi không xử lý nào và trả về một số lỗi "thân thiện với người dùng". Tuy nhiên, khi tôi đang làm thử nghiệm cào tôi muốn có những trình xử lý cứu hộ mặc định bị vô hiệu hóa vì vậy tôi có thể thấy lỗi đầy đủ & theo dõi ngăn xếp. Có cách nào tự động để thực hiện việc này không?Làm cách nào để vô hiệu hóa trình xử lý cứu hộ trong ứng dụng Ruby on Rails khi tôi đang chạy thử nghiệm chức năng?

Cập nhật để làm rõ: Tôi có một hành động như thế này:

def foo 
    # do some stuff... 
rescue 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
end 

Bây giờ khi tôi thử nghiệm chức năng này, nếu các ngoại lệ xảy ra sau đó tôi sẽ có được chỉ là một chút thông tin về ngoại lệ, nhưng những gì tôi muốn là để nó hoạt động như thể không có trình xử lý giải cứu ở đó, vì vậy tôi nhận được thông tin gỡ lỗi đầy đủ.

Cập nhật: GIẢI PHÁP

Tôi đã làm điều này:

rescue: 
    raise unless Rails.env.production? 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
    end 

Trả lời

9

Không hoàn toàn tự động, nhưng cách sửa đổi mã của bạn để loại bỏ các ngoại lệ bất cứ khi nào được gọi trong một thử nghiệm?

Có lẽ một cái gì đó như thế này:

def foo 
    # do some stuff... 
rescue 
    raise if ENV["RAILS_ENV"] == "test" 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
end 
+0

Tôi sẽ cố gắng! –

+3

tăng nếu Rails.env.test? là sạch hơn IMO – Scott

+0

@Steven điều này không thực sự giải cứu chỉ trong sản xuất. Nó làm tăng nó ở đâu .. nhưng nếu bạn có 20 dòng mã trong công cụ #do thì việc tăng không cho phép tham chiếu đến điều này. Dấu vết cho biết lỗi xảy ra trên dòng mà lệnh tăng lên. – baash05

0

Bạn đã nhìn bằng cách sử dụng assert_raise(exception1, exception2, ...) { block } cuộc gọi và sau đó in các ngoại lệ từ khối?

0

Bạn đang sử dụng phương pháp nào? Có hai phương thức cứu hộ trong ActionController.

Tôi có điều này trong bộ điều khiển cơ sở của tôi:

def rescue_action_in_public(exception) 
    response_code = response_code_for_rescue(exception) 
    status = interpret_status(response_code) 
    respond_to do |format| 
     format.html { render_optional_error_file response_code} 
     format.js { render :update, :status => status do |page| page.redirect_to(:url => error_page_url(status)) end} 
end 

cuối

chỉ này lỗi màn hình tùy chỉnh trong phương thức sản xuất.

+0

Tại sao nó chỉ chạy trong chế độ sản xuất? Tôi không thấy điều đó. –

-1

Bạn không cần phải tắt khối cứu hộ của mình. Sử dụng phương thức assert_raise (như đề nghị của Scott), và trong khối, gọi phương thức mà bạn mong đợi một ngoại lệ từ đó.

Ví dụ:

def test_throws_exception 
    assert_raise Exception do 
    raise_if_true(true) 
    end 
end 
+0

Tôi không cố gắng để khẳng định một ngoại lệ, tôi biết tất cả về cách làm điều đó và đã thực hiện nó nhiều lần. Tôi đang cố gắng để có được thông tin đầy đủ về trường hợp ngoại lệ xảy ra khi tôi không mong đợi họ (bao gồm cả dấu vết stack) nhưng chỉ khi tôi đang ở chế độ thử nghiệm. –

+0

Ah. Lấy làm tiếc. Tôi hiểu lầm những gì bạn đang cố gắng đạt được. –

0

Tôi nghĩ điều đơn giản nhất để làm là kiểm tra xem đúng làm cho là called-- hoặc bất cứ điều gì là khác biệt so với các trường hợp bình thường, không đặc biệt.

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