2010-11-18 15 views
11

mam test mniej więcej tak:Czy powinienem niszczyć moje ślady?

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

ja celowo dodaje

raise "blah" 

gdzieś w dół drogi i otrzymuję ten błąd:

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

kiedy Powinienem dostać coś ze sobą:

/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 

Jakieś pomysły, co jest oczyszczaniem/niszczeniem moich śladów? Mój podejrzany to shoulda, ponieważ kiedy wyjątek zdarza się wewnątrz konfiguracji lub powinien zaostrzyć sytuację.

To jest projekt Rails 3, w przypadku, gdy jest to ważne.

+0

dlaczego to podbicie, jeśli chcesz podnieść wyjątek? Jeśli jest to test, nie jest to format do zrobienia. – shingara

+1

@shingara Robię to podnieść tylko po to, aby zobaczyć, jak to wygląda. To, co się naprawdę dzieje, to to, że dostaję gdzieś wyjątek, inny wyjątek, ale nie mogę znaleźć, skoro coś ukrywa większość śladu. – Pablo

+0

Wszystkie raporty stacktrace są z twojego "podniesienia bla". Tak więc nie rozumiem twojego prawdziwego problemu. – shingara

Odpowiedz

0

Myślę, że da ci to ślad, który chcesz. Nie testowałem tego, ale powinno działać:

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

Czy sprawdziłeś numer config/initializers/backtrace_silencers.rb? To jest punkt wyjścia do dostosowania tego zachowania. Dzięki Rails.backtrace_cleaner.remove_silencers! możesz wyczyścić stos tłumików.

Więcej informacji o ActiveSupport::BacktraceCleaner można znaleźć here.

1

Dzieje się tak, ponieważ metoda beak #context generuje dla Ciebie kod. dla każdego bloku #should generuje dla ciebie zupełnie osobny test, np.

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 

Następnie #should wygeneruje dwa całkowicie niezależne testy (dla dwóch wywołań #should), jeden, który wykonuje

 @definition = SeedData.form_definition 
     assert something 

i jeszcze jeden, który wykonuje

 @definition = SeedData.form_definition 
     assert something_else 

Warto zauważyć, że robi to , a nie generuje jeden pojedynczy test wykonujący wszystkie trzy kroki w sekwencji.

te przyniosły bloków kodów mają nazwy metody takie jak _bind_ coś i wygenerowanym teście mają nazwa będąca połączeniem wszystkich nazw kontekstach ruch do bloku should plus ciąg dostarczonych przez powinno bloku (z prefiksem „powinien”). Jest another example in the documentation for shoulda-context.

Powiązane problemy