2

我已经在互联网上寻找了很长时间,令人沮丧,而我仍然很困惑该teardown()方法在 MiniTest 中的用途以及应该如何使用它。

我的基本要点是每次测试后运行 1 次,并撤消测试期间完成的 2 次操作,以便将来的测试在干净的环境中运行。

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

我也不清楚该方法是否应该明确填写。我发现了许多teardown()完全被排除在示例之外的示例。

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

简而言之:

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

4

1 回答 1

6

最简单的答案是您#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
于 2015-08-21T15:15:59.140 回答