- RSpec 教程
- RSpec - 首页
- RSpec - 简介
- RSpec - 基本语法
- RSpec - 编写规范
- RSpec - 匹配器
- RSpec - 测试替身
- RSpec - 存根
- RSpec - 钩子
- RSpec - 标签
- RSpec - 主题
- RSpec - 辅助方法
- RSpec - 元数据
- RSpec - 过滤
- RSpec - 期望
- RSpec 资源
- RSpec - 快速指南
- RSpec - 有用资源
- RSpec - 讨论
RSpec - 钩子
编写单元测试时,在测试前后运行设置和拆卸代码通常很方便。设置代码是配置或“设置”测试条件的代码。拆卸代码则进行清理,确保环境对于后续测试处于一致状态。
一般来说,您的测试应该彼此独立。当您运行整个测试套件并且其中一个测试失败时,您希望确信它失败是因为正在测试的代码存在错误,而不是因为之前的测试使环境处于不一致状态。
RSpec中最常用的钩子是`before`和`after`钩子。它们提供了一种定义和运行我们上面讨论的设置和拆卸代码的方法。让我们考虑这个示例代码:
class SimpleClass attr_accessor :message def initialize() puts "\nCreating a new instance of the SimpleClass class" @message = 'howdy' end def update_message(new_message) @message = new_message end end describe SimpleClass do before(:each) do @simple_class = SimpleClass.new end it 'should have an initial message' do expect(@simple_class).to_not be_nil @simple_class.message = 'Something else. . .' end it 'should be able to change its message' do @simple_class.update_message('a new message') expect(@simple_class.message).to_not be 'howdy' end end
运行此代码后,您将获得以下输出:
Creating a new instance of the SimpleClass class . Creating a new instance of the SimpleClass class . Finished in 0.003 seconds (files took 0.11401 seconds to load) 2 examples, 0 failures
让我们仔细看看发生了什么。`before(:each)`方法是我们定义设置代码的地方。当您传递`:each`参数时,您正在指示`before`方法在示例组中的每个示例之前运行,即上面代码中`describe`块内的两个`it`块。
在`@simple_class = SimpleClass.new`这一行中,我们正在创建`SimpleClass`类的新实例并将其赋值给对象的实例变量。您可能会好奇是什么对象?RSpec在`describe`块的范围内幕后创建了一个特殊的类。这允许您将值赋值给此类的实例变量,您可以在示例中的`it`块内访问这些变量。这也使得在测试中编写更简洁的代码变得更容易。如果每个测试(示例)都需要`SimpleClass`的实例,我们可以将该代码放在`before`钩子中,而无需将其添加到每个示例中。
请注意,“创建SimpleClass类的新实例”这一行被写入控制台两次,这表明`before`钩子在每个`it`块中都被调用。
正如我们提到的,RSpec还有一个`after`钩子,`before`和`after`钩子都可以接受`all`作为参数。`after`钩子将在指定的 target 后运行。`:all` target 意味着钩子将在所有示例之前/之后运行。这是一个简单的示例,说明每个钩子何时被调用。
describe "Before and after hooks" do before(:each) do puts "Runs before each Example" end after(:each) do puts "Runs after each Example" end before(:all) do puts "Runs before all Examples" end after(:all) do puts "Runs after all Examples" end it 'is the first Example in this spec file' do puts 'Running the first Example' end it 'is the second Example in this spec file' do puts 'Running the second Example' end end
运行上述代码后,您将看到此输出:
Runs before all Examples Runs before each Example Running the first Example Runs after each Example .Runs before each Example Running the second Example Runs after each Example .Runs after all Examples