Глобальные блоки настройки и демонтажа в Test :: Unit - PullRequest
21 голосов
/ 15 ноября 2009

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

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

Ответы [ 2 ]

23 голосов
/ 16 августа 2011

Предполагается, что вы используете 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.

7 голосов
/ 15 ноября 2009

Вы можете просто пропатчить 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
...