2012-02-19 33 views
13

'dan yığın izlemesi nasıl alınır Bazı Ruby kodlarını test ediyorum ve başarısız bir Test :: Birim :: TestCase'i var. Ne yazık ki, hata raporu sadece bir üst yığın izi değil, sadece en yüksek hatayı veriyor. Özellikle, diyor ki:Bir Test :: Birim :: TestCase

1) Failure: 
test_tp_make(TestScripts::TestTpMake) [test/test_scripts.rb:73]: 
Exception raised: 
<#<NoMethodError: undefined method `[]' for nil:NilClass>>. 

(73) referanslı satır numarası da sırayla büyük kütüphaneye çağırır başka bir kod bloğunu başlatır benim test durumda, bir assert_nothing_raised kod bloğunun başlangıcıdır.

Denemeyi --verbose bayrağıyla çalıştırmayı denedim, maalesef bu durum istisna çıkışını değiştirmiyor. Test :: Unit belgelerine başvurmayı denedim, ancak mevcut seçenekleri listelemiyor gibi görünmüyor (örneğin, here numaralı kullanışlı bir şey yok). Web'de arama yapmak ve StackOverflow, Rails'de yığın izlemenin nasıl etkinleştirileceğine dair bazı yanıtlar ortaya koydu, ancak bu Rails olmayan bir ruby ​​kodudur.

Arızalı kodu testten ayıklayıp Test :: Birim dışında çalıştırarak tüm çıktıları görmemi sağlarım. Fakat başarısız olduğum her testte bunu yapmak acı çekecek.

Test :: Biriminin bana tam yığın izini nasıl vereceğini bilen var mı?

+0

Testinizi "rake" ile mi çalıştırıyorsunuz? – Casper

+0

Hayır, tırmık koşmuyor. –

+0

Bu, Ruby 1.8, Ruby 1.9 veya ikiside mi? –

cevap

14

Ruby 1.8'deki Test :: Unit koduna bakarak, tüm hatalar #long_display yönteminde backtrace'i filtreleyen Test :: Unit :: Error nesnesinden geçer. Hiçbir yapılandırma yoktur ve tüm koşucular aynı filtrelenmiş izi kullanır.

Kaba kuvvet maymun yama tüm izleme almak için: (Ben tek bir test Dava dosyasında bu koyun; belki bir test yardımcı koyabiliriz) Ruby 1.9 için

require 'test/unit/util/backtracefilter' 

module Test::Unit::Util::BacktraceFilter 
    def filter_backtrace(backtrace, prefix=nil) 
    backtrace 
    end 
end 

Ve maymun yama (ki yararları en üst düzey kullanır

def MiniTest.filter_backtrace(bt) 
    bt 
end 
+0

+1 Hayatımı kurtardın! _ (veya en azından sanity) _ :-) – Arsen7

1

Tam yığın izlemesi almak için sınıfta her yerde bunu kullanın. Test sınıfımın hatalarını ayıklamak için birim test durumumda kullandım.

rescue => e 

puts e.inspect 

puts e.backtrace 
+0

Çözümünüz tamam, ancak sorun Test :: Unit'in var olma gerekliliğini ortadan kaldıracağıdır - tüm istisnaları manuel olarak izlemenizi öneririz. Soru şuydu: Test :: Unit'in tekrar nasıl faydalı olacağı. – Arsen7