RSpec 3.6 发布了!

Sam Phippen, Myron Marston, Jon Rowe

2017年5月4日

RSpec 3.6 刚刚发布!考虑到我们对语义版本控制的承诺,对于任何已经使用 RSpec 3 的用户来说,这是一个轻松的升级。但是,如果我们引入了任何回归问题,请告知我们,我们会尽快发布补丁版本进行修复。

RSpec 仍然是一个由社区驱动的项目,拥有来自世界各地的贡献者。此版本包含来自 50 位不同贡献者的 450 多次提交和 120 个合并的拉取请求!

感谢所有帮助使此版本发布的人!

显著变化

核心:现在可以很好地处理和格式化示例之外的错误

在 RSpec 的早期版本中,我们允许在加载规范文件或运行 :suite 钩子时遇到的错误导致 ruby 解释器崩溃,并提供其默认的完整堆栈跟踪输出。在 RSpec 3.6 中,我们现在处理所有在示例之外发生的错误,并对其进行美观的格式化,包括过滤后的回溯以及错误位置的代码片段。例如,现在 before(:suite) 钩子中的错误将以如下格式显示

Errors outside example execution

感谢 Jon Rowe 帮助开发此功能。

核心:如果 RSpec 输出到 tty,则会自动设置输出颜色。

在 RSpec 的过去版本中,即使您输出到终端、文件、CI 系统或其他输出位置,也需要指定 --color 来获得输出颜色。现在,如果 RSpec 检测到它在 TTY 中运行,它会自动为输出添加颜色。您仍然可以使用 --color 强制着色,或者如果您在 TTY 中运行,并且明确不想使用颜色,则可以指定 --no-color 来禁用此行为。

感谢 Josh Justice 为 RSpec 添加此行为。

核心:config.fail_if_no_examples

目前,如果未定义任何示例,RSpec 将以代码 0 退出,表示成功。此选项允许您配置 RSpec 以代码 1 退出,表示失败。这在 CI 环境中很有用,因为它可以帮助您检测您是否错误地配置了 RSpec,导致它在错误的位置或使用错误的模式查找规范。当没有找到规范并且 config.fail_if_no_examples 设置为 true 时,我们认为这是一种错误,而不是通过了套件运行。

RSpec.configure do |config|
  config.fail_if_no_examples = true
end

特别感谢 Ewa Czechowska 将此功能添加到核心。

预期:改进 changesatisfy 匹配器的失败消息

changesatisfy 匹配器都接受一个块。对于 change 匹配器,您使用它来指定您希望改变什么。对于 satisfy 匹配器,您使用块来指定您的通过/失败条件。在这两种情况下,失败消息一直都非常通用。例如,考虑以下规范

RSpec.describe "`change` and `satisfy` matchers" do
  example "`change` matcher" do
    a = b = 1

    expect {
      a += 1
      b += 2
    }.to change { a }.by(1)
    .and change { b }.by(1)
  end

  example "`satisfy` matcher" do
    expect(2).to satisfy { |x| x.odd? }
            .and satisfy { |x| x.positive? }
  end
end

RSpec 的早期版本会显示类似“预期结果改变了 1,但实际上改变了 2”和“预期 2 满足块”的失败消息。在这两种情况下,失败消息都是准确的,但不能帮助您区分哪个 changesatisfy 匹配器失败。

以下是 RSpec 3.6 上的失败输出示例

Failures:

  1) `change` and `satisfy` matchers `change` matcher
     Failure/Error:
       expect {
         a += 1
         b += 2
       }.to change { a }.by(1)
       .and change { b }.by(1)

       expected `b` to have changed by 1, but was changed by 2
     # ./spec/example_spec.rb:5:in `block (2 levels) in <top (required)>'

  2) `change` and `satisfy` matchers `satisfy` matcher
     Failure/Error:
       expect(2).to satisfy { |x| x.odd? }
               .and satisfy { |x| x.positive? }

       expected 2 to satisfy expression `x.odd?`
     # ./spec/example_spec.rb:13:in `block (2 levels) in <top (required)>'

感谢 Yuji Nakayama 的出色工作,RSpec 现在使用 Ripper 提取代码片段以包含在失败消息中。如果我们无法提取一个简单的单行代码片段,我们将回退到旧的通用消息。

预期:范围限定的别名和否定匹配器

在 RSpec 3 中,我们添加了 alias_matcher,允许用户 为匹配器创建别名,以提高可读性。在 3.1 中,我们添加了使用 define_negated_matcher 方法定义 否定匹配器 的功能。

在 RSpec 3.6 之前,当您调用这些方法中的任何一个时,新定义的匹配器始终在全局范围内定义。有了此功能,您可以在示例组(describecontext 等)的范围内调用 alias_matcherdefine_negated_matcher。这样做时,新定义的匹配器将仅对该示例组及其任何嵌套组中的示例可用。

RSpec.describe 'scoped matcher aliases' do
  describe 'example group with a matcher alias' do
    alias_matcher :be_a_string_starting_with, :start_with

    it 'can use the matcher alias' do
      expect('a').to be_a_string_starting_with('a')
    end
  end

  describe 'example group without the matcher alias' do
    it 'cannot use the matcher alias' do
      # fails because the matcher alias is not available
      expect('a').to be_a_string_starting_with('a')
    end
  end
end

感谢 Markus Reiter 贡献此功能。

模拟:without_partial_double_verification

当我们发布 RSpec 3.0 时,我们添加了 验证双重。验证双重允许您确保您使用 RSpec 创建的存根和模拟正确地模拟了测试中对象的接口。without_partial_double_verification 允许您在执行块的持续时间内关闭验证双重行为。例如

class Widget
  def call(takes_an_arg)
  end
end

RSpec.describe Widget do
  it 'can be stub with a mismatched arg count' do
    without_partial_double_verification do
      w = Widget.new
      allow(w).to receive(:call).with(1, 2).and_return(3)
      w.call(1, 2)
    end
  end
end

这里,如果未调用 without_partial_double_verification,则此测试将失败,因为我们在 Widget 对象上对 call 方法进行了存根,其参数数量与实现不同。我们添加此功能的目的是专门解决在对视图中的局部变量进行存根时,部分双重验证问题。有关详细信息,请参见 此问题 以及从此问题链接的 rspec-rails 问题。

特别感谢 Jon Rowe 添加此功能。

Rails:支持 Rails 5.1

RSpec 3.6.0 全面支持 Rails 5.1。Rails 5.1 API 没有重大变化,因此此升级应该非常顺利。只需将 RSpec 更新到最新版本,即可将支持添加到您的应用程序中,而无需您进行其他任何更改。

Rails 系统测试 尚未支持,但我们计划在不久的将来添加对它们的支持。

统计

合并

rspec-core

rspec-expectations

rspec-mocks

rspec-rails

rspec-support

文档

API 文档

Cucumber 功能

发行说明

RSpec 核心(合并所有 RSpec 3.6.0 的测试版)

3.6.0 / 2017-05-04

完整变更日志

增强功能

错误修复

3.6.0.beta2 / 2016-12-12

完整变更日志

增强功能

3.6.0.beta1 / 2016-10-09

完整变更日志

增强功能

RSpec 期望(合并所有 RSpec 3.6.0 的测试版)

3.6.0 / 2017-05-04

完整变更日志

增强功能

错误修复

3.6.0.beta2 / 2016-12-12

完整变更日志

错误修复

3.6.0.beta1 / 2016-10-09

完整变更日志

错误修复

RSpec 模拟 (结合了 RSpec 3.6.0 的所有 beta 版本)

3.6.0 / 2017-05-04

完整变更日志

错误修复

3.6.0.beta2 / 2016-12-12

完整变更日志

增强功能

3.6.0.beta1 / 2016-10-09

完整变更日志

错误修复

RSpec Rails (结合了 RSpec 3.6.0 的所有 beta 版本)

3.6.0 / 2017-05-04

完整变更日志

增强功能

错误修复

3.6.0.beta2 / 2016-12-12

完整变更日志

增强功能

3.6.0.beta1 / 2016-10-09

完整变更日志

增强功能

RSpec 支持 (结合了 RSpec 3.6.0 的所有 beta 版本)

3.6.0 / 2017-05-04

完整变更日志

增强功能

3.6.0.beta2 / 2016-12-12

完整变更日志

没有用户界面更改。

3.6.0.beta1 / 2016-10-09

完整变更日志

错误修复