Rails-如何使用MiniTest的拆解方法

时间:2015-08-20 17:53:46

标签: ruby-on-rails minitest teardown

我一直在互联网上寻找漫长的,令人沮丧的,同时,我仍然对MiniTest中teardown()方法的目的以及它应该如何使用感到困惑。

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

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

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

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

简而言之:

是否需要明确创建拆解?在什么情况下它需要被覆盖而且不会被覆盖?

1 个答案:

答案 0 :(得分:2)

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

  1. 创建数据库事务(Minitest::Test#setup
  2. 运行您的测试方法(MyTest#test_something
  3. 回滚数据库事务(Minitest::Test#teardown
  4. 人们使用#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