Rails-如何使用MiniTest的Teardown方法
Rails-How to use MiniTest's Teardown Method
我已经在互联网上搜索了很长时间,令人沮丧,但我仍然很困惑 teardown()
方法在 MiniTest 中的目的是什么以及应该如何使用它。
我的基本要点是每次测试后 1-运行,并且 2-撤消测试期间完成的事情,以便将来的测试能够 运行干净的环境。
但是,我不清楚它需要撤消的事情的性质:是否需要清空数据库?重置 class 个变量?等等
我也不清楚该方法是否应该明确填写。我发现许多示例中 teardown()
完全不在示例中。
(我最好的猜测是有一个超级方法 teardown
运行 会自动处理某些事情。这可以解释为什么它经常被遗漏,并且也会解释为什么在给定的 teardown()
方法中有些东西被重置而有些东西没有。但我仍然不知道哪些东西是什么东西不是。)
简而言之:
是否需要显式创建拆解?什么情况下需要覆盖,什么情况下不需要?
最简单的答案是您在每次测试中都使用 #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
我已经在互联网上搜索了很长时间,令人沮丧,但我仍然很困惑 teardown()
方法在 MiniTest 中的目的是什么以及应该如何使用它。
我的基本要点是每次测试后 1-运行,并且 2-撤消测试期间完成的事情,以便将来的测试能够 运行干净的环境。
但是,我不清楚它需要撤消的事情的性质:是否需要清空数据库?重置 class 个变量?等等
我也不清楚该方法是否应该明确填写。我发现许多示例中 teardown()
完全不在示例中。
(我最好的猜测是有一个超级方法 teardown
运行 会自动处理某些事情。这可以解释为什么它经常被遗漏,并且也会解释为什么在给定的 teardown()
方法中有些东西被重置而有些东西没有。但我仍然不知道哪些东西是什么东西不是。)
简而言之:
是否需要显式创建拆解?什么情况下需要覆盖,什么情况下不需要?
最简单的答案是您在每次测试中都使用 #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