Должен ли я уничтожить мои следы?

У меня есть тест примерно такой:

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

Я специально добавил

raise "blah"

где-то в будущем, и я получаю эту ошибку:

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

когда я должен получить что-то вместе:

/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

Любые идеи, что дезинфицирует/уничтожает мои следы? Я подозреваю, что должно, потому что, когда исключение происходит внутри установки или должно, это происходит.

Это проект Rails 3, если это важно.


person pupeno    schedule 18.11.2010    source источник
comment
зачем это поднимать, если вы хотите вызвать какое-то исключение? Если это тест, то это не тот формат.   -  person shingara    schedule 18.11.2010
comment
@shingara Я делаю это повышение, просто чтобы посмотреть, как оно выглядит. Что на самом деле происходит, так это то, что я получаю исключение откуда-то, еще одно исключение, но я не могу найти, где что-то скрывает большую часть обратной трассировки.   -  person pupeno    schedule 18.11.2010
comment
Все трассировки стека, о которых вы сообщаете, взяты из вашего рейза. Так что я не понимаю вашей действительно проблемы   -  person shingara    schedule 18.11.2010
comment
@shingara: моя проблема в том, что трассировка стека, когда ошибка возникает внутри метода, вызываемого из установки или должна, не содержит всех кадров до самого повышения. form_definition_test.rb:79 не вызывает бла, он вызывается методом, вызванным другим вызовом метода, как вы можете видеть во второй трассировке стека.   -  person pupeno    schedule 18.11.2010
comment
@Дж. Пабло Фернандес: Если вы добавляете raise "blah", чтобы опубликовать минимальный (воспроизводимый) пример, мы будем признательны, если вы опубликуете минимальный пример, который мы можем запустить сами (без добавления кода) для воспроизведения проблемы. .   -  person Ken Bloom    schedule 18.11.2010
comment
У меня тоже эта проблема. Вы когда-нибудь догадывались об этом?   -  person gtd    schedule 15.03.2011
comment
Проблема, о которой он пытается сообщить, заключается в том, что shoulda каким-то образом проглатывает исключения, возникающие в ходе теста, тем самым скрывая их трассировку стека. Я с той же проблемой.   -  person Pedro Rolo    schedule 22.03.2011
comment
возможно, глушители обратного следа издеваются над вами. Прочтите комментарий в config/initializers/backtrace_silencers.rb. Я обычно удаляю все чистящие средства. Я могу жить с длинными обратными следами.   -  person ffoeg    schedule 29.03.2012


Ответы (3)


Это потому, что метод shoulda #context генерирует для вас код. для каждого блока #should он генерирует для вас совершенно отдельный тест, например.

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

Затем #should сгенерирует два полностью независимых теста (для двух вызовов #should), один из которых выполняет

      @definition = SeedData.form_definition
      assert something

и еще один, который выполняет

      @definition = SeedData.form_definition
      assert something_else

Стоит отметить, что он не создает один единственный тест, выполняющий все три шага в последовательности.

Эти сгенерированные блоки кодов имеют имена методов, такие как _bind_ something, а сгенерированный тест имеет имя, которое представляет собой конкатенацию всех имен контекстов, пройденных в блоке should, плюс строка, предоставленная блоком must (с префиксом «should»). В документации для shoulda-context есть еще один пример.

person Jarl    schedule 30.10.2012

Я думаю, что это даст вам обратную связь, которую вы хотите. Я не проверял, но должно работать:

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
person Linuxios    schedule 30.04.2012

Вы проверили config/initializers/backtrace_silencers.rb? Это точка входа для настройки этого поведения. С помощью Rails.backtrace_cleaner.remove_silencers! вы можете очистить стек глушителей.

Дополнительную информацию о ActiveSupport::BacktraceCleaner можно найти здесь.

person Luca Guidi    schedule 04.05.2012