Rails-如何使用MiniTest的Teardown方法

Rails-How to use MiniTest's Teardown Method

我已经在互联网上搜索了很长时间,令人沮丧,但我仍然很困惑 teardown() 方法在 MiniTest 中的目的是什么以及应该如何使用它。

我的基本要点是每次测试后 1-运行,并且 2-撤消测试期间完成的事情,以便将来的测试能够 运行干净的环境。

但是,我不清楚它需要撤消的事情的性质:是否需要清空数据库?重置 class 个变量?等等

我也不清楚该方法是否应该明确填写。我发现许多示例中 teardown() 完全不在示例中。

(我最好的猜测是有一个超级方法 teardown 运行 会自动处理某些事情。这可以解释为什么它经常被遗漏,并且也会解释为什么在给定的 teardown() 方法中有些东西被重置而有些东西没有。但我仍然不知道哪些东西是什么东西不是。)

简而言之:

是否需要显式创建拆解?什么情况下需要覆盖,什么情况下不需要?

最简单的答案是您在每次测试中都使用 #teardown,但您不必为此担心。与 Rails 生命周期类似,还有一个 Minitest 生命周期。有一些钩子可以注入测试要使用的逻辑和行为。 Rails 测试中的主要测试是数据库事务。每个使用 ActiveSupport::TestCase 的测试都在数据库事务中运行。流程是这样的:

  1. 创建数据库事务(Minitest::Test#setup
  2. 运行你的测试方法(MyTest#test_something)
  3. 回滚数据库事务(Minitest::Test#teardown)

人们使用 #setup 创建用于测试的对象是很常见的。测试方法完成后,测试对象被垃圾收集,因此大多数人不会在测试后使用 #teardown 进行清理。因此 #teardown 通常是一个更高级的功能,您在编写测试时通常不会使用它。我看到它更常用于增强 Minitest 的测试库。

但有时我会在测试中使用 #teardown。这是我何时可以使用它的示例。

require "minitest/autorun"

class Foo
  def initialize namer
    @namer = namer
  end
  def name
    @namer.name
  end
end

class FooTest < Minitest::Test
  def setup
    @namer_mock = Minitest::Mock.new
    @namer_mock.expect :name, "foo"
    @foo = Foo.new @namer_mock
  end

  def test_name
    assert_equal "foo", @foo.name
  end

  def teardown
    @namer_mock.verify
  end
end