Подтвердить что ты не робот

Должен ли я разрушить мои обратные пути?

У меня есть тест более или менее:

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, если это важно.

4b9b3361

Ответ 1

Это потому, что метод toa #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_, а сгенерированный тест имеют имя, которое представляет собой конкатенацию всех имен контекстов, перемещенных в блок should, плюс строку, предоставленную блоком should (с префиксом "должен" ). Существует еще один пример в документации для shoulda-context.

Ответ 2

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

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

Ответ 3

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

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