- en
- ja
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)
钩子中的错误将以如下格式显示
感谢 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 将此功能添加到核心。
预期:改进 change
和 satisfy
匹配器的失败消息
change
和 satisfy
匹配器都接受一个块。对于 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 满足块”的失败消息。在这两种情况下,失败消息都是准确的,但不能帮助您区分哪个 change
或 satisfy
匹配器失败。
以下是 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 之前,当您调用这些方法中的任何一个时,新定义的匹配器始终在全局范围内定义。有了此功能,您可以在示例组(describe
、context
等)的范围内调用 alias_matcher
或 define_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 系统测试 尚未支持,但我们计划在不久的将来添加对它们的支持。
统计
合并
- 总提交次数: 493
- 合并的拉取请求: 127
- 58 位贡献者: Alessandro Berardi, Alex Coomans, Alex DeLaPena, Alyssa Ross, Andy Morris, Anthony Dmitriyev, Ben Pickles, Benjamin Quorning, Damian Simon Peter, David Grayson, Devon Estes, Dillon Welch, Eugene Kenny, Ewa Czechowska, Gaurish Sharma, Glauco Custódio, Hanumakanth, Hun Jae Lee, Ilya Lavrov, Isaac Betesh, John Meehan, Jon Jensen, Jon Moss, Jon Rowe, Josh Justice, Juanito Fatas, Jun Aruga, Kevin Glowacz, Koichi ITO, Krzysztof Zych, Luke Rollans, Luís Costa, Mark Campbell, Markus Reiter, Markus Schwed, Megan O'Neill, Mike Butsko, Mitsutaka Mimura, Myron Marston, Olle Jonsson, Phil Thompson, Sam Phippen, Samuel Giddins, Samuel Lourenço, Sasha Gerrand, Sophie Déziel, Travis Spangle, VTJamie, Wojciech Wnętrzak, Xavier Shay, Yuji Nakayama, ansonK, bootstraponline, gajewsky, matrinox, mrageh, proby, yui-knk
rspec-core
- 总提交次数: 201
- 合并的拉取请求: 59
- 25 位贡献者: Alyssa Ross, Benjamin Quorning, David Grayson, Devon Estes, Eugene Kenny, Ewa Czechowska, Ilya Lavrov, Jon Jensen, Jon Rowe, Josh Justice, Juanito Fatas, Jun Aruga, Mark Campbell, Mitsutaka Mimura, Myron Marston, Phil Thompson, Sam Phippen, Samuel Lourenço, Travis Spangle, VTJamie, Xavier Shay, Yuji Nakayama, bootstraponline, matrinox, yui-knk
rspec-expectations
- 总提交次数: 85
- 合并的拉取请求: 25
- 11 位贡献者: Alex DeLaPena, Alyssa Ross, Gaurish Sharma, Jon Rowe, Koichi ITO, Markus Reiter, Myron Marston, Sam Phippen, Xavier Shay, Yuji Nakayama, gajewsky
rspec-mocks
- 总提交次数: 68
- 合并的拉取请求: 17
- 13 位贡献者: Alessandro Berardi, Alex DeLaPena, Dillon Welch, Glauco Custódio, Jon Rowe, Luís Costa, Myron Marston, Olle Jonsson, Sam Phippen, Samuel Giddins, Yuji Nakayama, mrageh, proby
rspec-rails
- 总提交次数: 84
- 合并的拉取请求: 13
- 25 位贡献者: Andy Morris, Anthony Dmitriyev, Ben Pickles, Damian Simon Peter, Hanumakanth, Hun Jae Lee, Isaac Betesh, John Meehan, Jon Moss, Jon Rowe, Josh Justice, Kevin Glowacz, Krzysztof Zych, Luke Rollans, Markus Schwed, Megan O'Neill, Mike Butsko, Myron Marston, Sam Phippen, Sasha Gerrand, Sophie Déziel, Wojciech Wnętrzak, Xavier Shay, Yuji Nakayama, yui-knk
rspec-support
- 总提交次数: 55
- 合并的拉取请求: 13
- 7 位贡献者: Alex Coomans, Jon Rowe, Myron Marston, Olle Jonsson, Sam Phippen, Yuji Nakayama, ansonK
文档
API 文档
Cucumber 功能
发行说明
RSpec 核心(合并所有 RSpec 3.6.0 的测试版)
3.6.0 / 2017-05-04
增强功能
- 将种子信息添加到 JSON 格式化程序的输出中。(#2388, Mitsutaka Mimura)
- 将示例 ID 包含在 JSON 格式化程序的输出中。(#2369, Xavier Shay)
- 在格式化程序设置后,尊重对
config.output_stream
的更改。(#2401, #2419, Ilya Lavrov)
错误修复
- 延迟格式化程序的加载,直到最后一分钟,以便在触发格式化程序设置之前访问报告器。 (Jon Rowe, #2243)
- 确保在示例之前运行的上下文钩子失败可以访问报告器。 (Jon Jensen, #2387)
- 对允许在同一进程中多次使用运行器的多个修复:
RSpec.clear_examples
重置格式化程序,并且不再清除共享示例,并且流可以在多次运行中使用,而不是在第一次运行后关闭。(#2368, Xavier Shay) - 防止意外的
example_group_finished
通知导致错误。(#2396, VTJamie) - 修复在某些情况下
config.when_first_matching_example_defined
钩子会多次触发的问题。(Yuji Nakayama, #2400) - 当持久性文件中的
status
字段包含无法识别的值时,将last_run_status
默认设置为“unknown”。(#2360, matrinox) - 防止
let
定义initialize
方法。(#2414, Jon Rowe)
3.6.0.beta2 / 2016-12-12
增强功能
- 将示例之外发生的错误数量包含在默认摘要中。(#2351, Jon Rowe)
- 在递归包含共享示例组时发出警告。(#2356, Jon Rowe)
- 使用 CodeRay 改进失败代码片段的语法高亮显示,以高亮显示 RSpec 的“关键字”,例如
expect
。(#2358, Myron Marston)
3.6.0.beta1 / 2016-10-09
增强功能
- 当由于在匹配规范模式的文件(例如
_spec.rb
)中定义,导致重复的共享示例定义加载时发出警告。(Devon Estes, #2278) - 改进元数据过滤,使其可以匹配实现
===
的任何对象,而不是将正则表达式视为特殊对象。(Myron Marston, #2294) - 改进
rspec -v
,使其打印出 RSpec 的每个部分的版本,以防止混淆。(Myron Marston, #2304) - 添加
config.fail_if_no_examples
选项,如果未找到任何示例,则会导致 RSpec 失败。(Ewa Czechowska, #2302) - 美观地格式化在加载规范文件时遇到的错误。(Myron Marston, #2323)
- 改进启用和禁用颜色输出的 API (Josh Justice, #2321)
- 如果输出是 TTY,则自动启用颜色,因为如果输出可以处理颜色,则几乎总是希望使用颜色。
- 引入新的 CLI 标志来强制使用颜色(
--force-color
),即使输出不是 TTY 也是如此。--no-color
仍然有效。 - 引入
config.color_mode
用于从 Ruby 配置颜色。:automatic
是默认设置,如果输出是 TTY,则会产生颜色。:on
强制打开,:off
强制关闭。
RSpec 期望(合并所有 RSpec 3.6.0 的测试版)
3.6.0 / 2017-05-04
增强功能
- 将 NoMethodError 视为比较匹配器的失败。(Jon Rowe, #972)
- 允许范围限定的别名和否定匹配器 - 只需在示例组中调用
alias_matcher
或define_negated_matcher
即可。(Markus Reiter, #974) - 通过包含块代码片段而不是在 Ripper 可用时将其描述为
result
或block
来改进带有块的change
匹配器和satisfy
匹配器的失败消息。(Yuji Nakayama, #987)
错误修复
- 修复
yield_with_args
和yield_successive_args
匹配器,以便在产生参数时比较预期参数和实际参数,而不是在结束时比较,以防产生参数的方法在产生参数后修改参数。(Alyssa Ross, #965)
3.6.0.beta2 / 2016-12-12
错误修复
- 在
File
上使用exist匹配器不再产生弃用警告。(Jon Rowe, #954)
3.6.0.beta1 / 2016-10-09
错误修复
- 修复
contain_exactly
使其与范围一起正常工作。(Myron Marston, #940) - 修复
change
使其与集合一起正常工作。(Marcin Gajewski, #939)
RSpec 模拟 (结合了 RSpec 3.6.0 的所有 beta 版本)
3.6.0 / 2017-05-04
错误修复
- 修复在没有 rspec-core 的情况下使用 rspec-mocks 时出现“实例变量 @color 未初始化”的警告。(Myron Marston, #1142)
- 在 1.8.7 上存根时,正确恢复别名模块方法。(Samuel Giddins, #1144)
- 允许消息链期望受参数约束。(Jon Rowe, #1156)
3.6.0.beta2 / 2016-12-12
增强功能
- 添加新的
without_partial_double_verification { }
API,允许您暂时为示例关闭部分双重验证。(Jon Rowe, #1104)
3.6.0.beta1 / 2016-10-09
错误修复
- 从
#freeze
返回测试双重实例 (Alessandro Berardi, #1109) - 允许存根
new
的特殊逻辑在<Class>.method
被重新定义时工作。(Proby, #1119)
RSpec Rails (结合了 RSpec 3.6.0 的所有 beta 版本)
3.6.0 / 2017-05-04
增强功能
- 添加对 Rails 5.1 的兼容性。(Sam Phippen, Yuichiro Kaneko, #1790)
错误修复
- 修复脚手架生成器,使其不会在 Rails 3.x 和 4.x 上生成损坏的控制器规范。(Yuji Nakayama, #1710)
3.6.0.beta2 / 2016-12-12
增强功能
- 通过列出排队的作业来改进 ActiveJob 匹配器的失败输出。(Wojciech Wnętrzak, #1722)
- 默认情况下,在
rails_helper.rb
中更早加载spec_helper.rb
。(Kevin Glowacz, #1795)
3.6.0.beta1 / 2016-10-09
增强功能
- 在 Rails
>= 5.1
中添加对rake notes
的支持。(John Meehan, #1661) - 从脚手架规范生成器中删除
assigns
和assert_template
(Josh Justice, #1689) - 添加对为 API 应用程序规范生成脚手架的支持。(Krzysztof Zych, #1685)
RSpec 支持 (结合了 RSpec 3.6.0 的所有 beta 版本)
3.6.0 / 2017-05-04
增强功能
- 从 rspec-core 导入
Source
类。(Yuji Nakayama, #315)
3.6.0.beta2 / 2016-12-12
没有用户界面更改。
3.6.0.beta1 / 2016-10-09
错误修复
- 防止截断的格式化对象输出破坏控制台代码。(#294, Anson Kelly)