Rails-如何使用MiniTest的Teardown方法

4

我在互联网上寻找了很长时间,但仍然不太清楚 MiniTest 中 teardown() 方法的作用及其如何使用。

我了解的基本概念是:1-在每个测试运行后运行,2-撤消测试期间执行的操作,以便未来的测试能够在一个干净的环境下运行。

然而,我不确定它需要撤消哪些操作:是否需要清空数据库?重置类变量?等等。

我也不确定是否需要明确填写该方法。我发现许多示例完全没有使用 teardown()

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

简而言之:

需要明确创建 teardown 吗?在什么情况下需要覆盖它,在什么情况下不需要覆盖?

1个回答

13
最简单的回答是在每个测试中使用#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

3
这是一个正确的总结(只是想确保我理解得对)吗?基本上,#teardown不需要用于清空数据库或销毁测试期间创建的实例。但如果您想在测试运行后进行更高级的操作,超出了仅确保DB为空和实例已消失的范围,那么可能需要使用它。是这样吗? - Jo.P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接