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

Глобальные блоки настройки и блокировки в Test:: Unit

Каков наилучший способ запуска установки перед каждым методом во всем тестовом наборе (не только в одном тестовом классе)?

Rspec позволяет вам определять глобальные до и после блоков. Есть ли сравнимый способ для этого в Test:: Unit, который не включает смешивание модуля в каждый тестовый класс?

4b9b3361

Ответ 1

Вы можете просто установить Test::Unit::TestCase и определить метод setup:

class Test::Unit::TestCase
  def setup
    puts 'in setup'
  end
end

И ваши подклассы будут использовать это по умолчанию:

class FooTest < Test::Unit::TestCase
  def test_truth
    assert true
  end
end

class BarTest < Test::Unit::TestCase
  def test_truth
    assert true
  end
end

Если для тестового примера необходимо иметь собственную настройку, сначала нужно вызвать super, чтобы убедиться, что выполняется глобальная настройка:

class BazTest < Test::Unit::TestCase
  def setup
    super
    puts 'custom setup'
  end

  def test_truth
    assert true
  end
end

Имеет ли глобальная настройка действительно что-то, что вам нужно сделать, или было бы полезно иметь вспомогательный метод, определенный на Test::Unit::TestCase, и вызывать это в тестах, которые в нем нуждаются? Метод вспомогательного метода - это то, что я нахожу полезным для своих проектов. Ndash; состояние и намерение установки более ясны в каждом отдельном тесте, и мне не нужно прыгать, чтобы найти какой-то "скрытый" способ настройки. Довольно часто глобальная настройка - это запах кода, указывающий, что вам нужно пересмотреть часть своего дизайна, но YMMV.

Обновление

Так как вы используете ActiveSupport, здесь сначала нужно нанести удар по тому, что не требует вызова super каждый раз, когда вы определяете метод setup в вашем тестовом примере. Я не знаю, насколько это ценно, поскольку для этого требуется вызов другого метода, и любой разработчик может просто определить свой собственный метод setup в тестовом примере, который приведет к аннулированию этого изменения. Вот он:

require 'rubygems'
require 'test/unit'
require 'active_support'
require 'active_support/test_case'

class ActiveSupport::TestCase

  def setup_with_global
    puts 'In Global setup'
    setup_without_global
  end

  alias_method_chain :setup, :global

end

class FooTest < ActiveSupport::TestCase

  def setup_without_global
    puts 'In Local setup'
  end

  def test_truth
    assert true
  end

end

Ответ 2

Предполагая, что вы используете Rails. Просто добавьте следующее в свой test/test_helper.rb файл.

class ActiveSupport::TestCase
  setup :global_setup

  def global_setup
    #stuff to run before _every_ test.
  end
end

Проверено на Rails 3.0.9.