我一直在互联网上寻找漫长的,令人沮丧的,同时,我仍然对MiniTest中teardown()
方法的目的以及它应该如何使用感到困惑。
我的基本要点是每次测试后都是1次运行,并且在测试期间完成2次撤销操作,以便将来的测试在干净的环境中运行。
但是,我不清楚需要撤消的事情的性质:是否需要清空数据库?重置类变量?等
我也不清楚该方法是否应该明确填写。我找到了很多例子,其中teardown()
被完全排除在示例之外。
(我最好的猜测是有一个超级方法teardown
自动运行并处理某些事情。这可以解释为什么它经常被遗漏,并且还解释了为什么有些东西被重置了一个给定的teardown()
方法,有些不是。但我仍然不知道哪些是什么,哪些不是。)
简而言之:
是否需要明确创建拆解?在什么情况下它需要被覆盖而且不会被覆盖?
答案 0 :(得分:2)
最简单的答案是您在每次测试中都使用#teardown
,但您无需担心。与Rails生命周期类似,有一个Minitest生命周期。有一些钩子可以注入要由测试使用的逻辑和行为。 Rails测试中的主要是数据库事务。使用ActiveSupport::TestCase
的每个测试都在数据库事务中运行。流程是这样的:
Minitest::Test#setup
)MyTest#test_something
)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