2010-11-18 30 views
11

Tôi có một bài kiểm tra nhiều hơn hoặc ít hơn như thế này:Có phải tôi đang tiêu diệt backtraces của tôi?

class FormDefinitionTest < ActiveSupport::TestCase 
    context "a form_definition" do 
    setup do 
     @definition = SeedData.form_definition 
     # ... 

Tôi đã cố ý thêm vào một

raise "blah" 

đâu đó xuống đường và tôi nhận được lỗi này:

RuntimeError: blah 
test/unit/form_definition_test.rb:79:in `__bind_1290079321_362430' 

khi Tôi nên nhận được điều gì đó dọc theo:

/Users/pupeno/projectx/db/seed/sheet_definitions.rb:17:in `sheet_definition': blah (RuntimeError) 
    from /Users/pupeno/projectx/db/seed/form_definitions.rb:4:in `form_definition' 
    from /Users/pupeno/projectx/test/unit/form_definition_test.rb:79 

Bất kỳ ý tưởng gì là khử trùng/phá hủy backtraces của tôi? Nghi ngờ của tôi là do một khi ngoại lệ xảy ra bên trong một thiết lập hoặc nên là whet nó xảy ra.

Đây là dự án Rails 3, trong trường hợp đó là quan trọng.

+0

tại sao điều này tăng nếu bạn muốn tăng một số ngoại lệ? Nếu đó là một thử nghiệm, nó không phải là định dạng để làm. – shingara

+1

@shingara Tôi đang làm điều đó chỉ để xem nó trông như thế nào. Điều thực sự xảy ra là tôi nhận được một ngoại lệ từ một nơi nào đó, một ngoại lệ khác, nhưng tôi không thể tìm thấy nơi mà một cái gì đó đang ẩn hầu hết các backtrace. – Pablo

+0

Tất cả các stacktrace bạn báo cáo là từ của bạn "nâng cao blah". Vì vậy, tôi không hiểu vấn đề thực sự của bạn – shingara

Trả lời

0

Tôi nghĩ rằng điều này sẽ cung cấp cho bạn backtrace mà bạn muốn. Tôi chưa thử nghiệm, nhưng nó sẽ hoạt động:

def exclude_backtrace_from_location(location) 
    begin 
    yeild 
    rescue => e 
    puts "Error of type #{e.class} with message: #{e.to_s}.\nBacktrace:" 
    back=e.backtrace 
    back.delete_if {|b| b~=/\A#{location}.+/} 
    puts back 
    end 
end 

exclude_backrace_from_location("test/unit") do 
    #some shoulda code that raises... 
end 
0

Bạn đã kiểm tra config/initializers/backtrace_silencers.rb chưa? Đó là điểm vào để tùy chỉnh hành vi đó. Với Rails.backtrace_cleaner.remove_silencers! bạn có thể dọn dẹp bộ phận giảm thanh.

Bạn có thể tìm thêm thông tin về ActiveSupport::BacktraceCleanerhere.

1

Đó là vì phương pháp được hiển thị là #context đang tạo mã cho bạn. cho mỗi khối #should nó tạo ra một thử nghiệm hoàn toàn riêng biệt cho bạn, ví dụ:

class FormDefinitionTest < ActiveSupport::TestCase 
    context "a form_definition" do 
    setup do 
     @definition = SeedData.form_definition 
    end 

    should "verify some condition" do 
     assert something 
    end 

    should "verify some other condition" do 
     assert something_else 
    end 
    end 
end 

Sau đó #should sẽ tạo ra hai bài kiểm tra hoàn toàn độc lập (đối với hai lời gọi của #should), người thực hiện điều

 @definition = SeedData.form_definition 
     assert something 

và một số khác mà thực hiện

 @definition = SeedData.form_definition 
     assert something_else 

Nó là đáng chú ý rằng nó không không tạo ra một thử nghiệm duy nhất thực hiện tất cả ba bước trong một chuỗi.

Các khối mã được tạo này có tên phương thức như _bind_ điều gì đó và thử nghiệm được tạo có tên là một kết nối của tất cả các tên của ngữ cảnh được chuyển đến khối should cộng với chuỗi được cung cấp bởi khối phải (bắt đầu bằng "nên"). Có another example in the documentation for shoulda-context.

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