Rails-如何使用MiniTest的Teardown方法

Jo.*_*o.P 2 ruby-on-rails minitest teardown

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

我的基本要点是每次测试后运行 1 次,然后 2 次撤消测试期间所做的事情,以便将来的测试在干净的环境中运行。

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

我也不清楚该方法是否应该明确填写。我发现了很多例子,其中teardown()完全被排除在这个例子之外。

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

简而言之:

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

blo*_*age 5

最简单的答案是您#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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个正确的总结(只是想确保我理解)?基本上,不需要`#teardown` 来清空数据库或销毁在测试期间创建的实例。如果你想在测试运行后做一些更高级的事情,它是需要的(或者至少可能是);不仅仅是确保数据库为空并且实例消失了。对吗? (3认同)