Test :: Unit中的全局设置和拆卸块

时间:2009-11-15 04:16:56

标签: ruby testunit

在整个测试套件(不仅仅是一个测试类)中的每个方法之前运行设置的最佳方法是什么?

Rspec允许您定义块之前和之后的全局。在Test :: Unit中是否有一种干净的可比方法,它不涉及将模块混合到每个测试类中?

2 个答案:

答案 0 :(得分:23)

假设您正在使用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上测试。

答案 1 :(得分:7)

您可以修补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上定义辅助方法并在需要它的测试中调用它会有帮助吗?辅助方法方法是我认为对我的项目有益的 - 在每个单独的测试中设置状态和意图更清晰,我不需要跳转来找到一些“隐藏”设置方法。通常,全局设置是代码气味,表明您需要重新考虑部分设计,但是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