RSpec 2.99 和 3.0 beta 版已经发布!
Myron Marston
2013 年 11 月 8 日RSpec 团队刚刚发布了 RSpec 3.0.0.beta1 - 第一个 RSpec 3 预发布版本!与此同时,我们还发布了 2.99.0.beta1,旨在帮助升级过程。
我要感谢所有贡献者,尤其是核心团队(Andy、Bradley、Jon、Sam 和 Xavier)使这个版本得以实现。
我现在没有精力写一篇完整的“RSpec 3 中的新增内容”博客文章,但我们主要根据 之前宣布的 RSpec 3 计划 进行更改。详细的发布说明在下面,以帮助您了解这些版本的详细信息。我们将继续发布其他博客文章,深入讨论新功能。
升级过程
RSpec 3 包含许多重大更改,但我们希望这将是您有史以来最平滑的主要版本 gem 升级。为了协助该过程,我们一直在与 RSpec 3 同时开发 RSpec 2.99。每当我们在 3.0 的主分支中进行重大更改时,我们一直在为 2.99 添加相应的弃用。这不仅仅针对已删除的 API;它也针对边缘情况语义的细微变化(为了使 RSpec 更一致),某些项目可能依赖这些变化。RSpec 2.99 不仅仅提供一个通用的升级文档来描述所有重大更改(包括影响很少用户的许多更改!),它还为您提供详细的升级清单。
此外,Yuji Nakayama 一直在开发 transpec - 一个非常棒的工具,可以自动升级大多数 RSpec 套件。我在几个项目中尝试过它,我对它的效果感到惊叹。
以下是我推荐的升级项目到 RSpec 3 的一般方法
- 确保您的测试套件已经在您使用的任何 RSpec 2.x 版本上正常运行。
- 安装 RSpec 2.99.0.beta1(或在您执行此过程时发布的最新 2.99 版本)。
- 运行您的测试套件并确保它仍然正常运行。(它应该正常运行,但我们可能犯了错误 - 如果它破坏了任何东西,请报告错误!)。现在是提交代码的好时机。
- 您会注意到,在规范运行结束时会打印出一堆弃用警告。这些警告可能被截断,因为我们不想用相同的弃用警告一再地轰炸您。要获取完整的弃用列表,您可以通过设置
config.deprecation_stream = 'rspec.log'
选项将它们管道到文件中。 - 如果您想了解所有被弃用内容,建议您阅读弃用消息。在某些情况下,您有选择 - 例如,继续通过提取的 rspec-collection_matchers gem 使用
have
集合基数匹配器,或者将期望表达式改写为类似expect(list.size).to eq(3)
的内容。 gem install transpec
(请注意,这不需要进入您的Gemfile
:您在捆绑包的上下文之外作为独立可执行文件运行transpec
)。- 在您的项目上运行 transpec。检查
transpec --help
或 自述文件 以获取完整的选项列表。 - 运行测试套件(它应该仍然正常运行,但始终检查一下!)并提交代码。
- 如果有任何剩余的弃用警告(transpec 无法处理您可能获得的所有警告),请处理它们。
- 一旦您拥有针对 RSpec 2.99 运行的无弃用测试套件,您就可以升级到 RSpec 3。安装 RSpec 3.0.0.beta1(或在您执行此过程时发布的最新 3.x 版本)。
- 运行您的测试套件。它应该仍然正常运行。如果出现任何故障,请打开一个 GitHub 问题 - 我们认为这是一个 bug[^foot_1]!
- 提交代码并享受使用最新 RSpec 版本的乐趣!
下一步
虽然我们在 RSpec 3 上取得了重大进展,但我们还没有完成。我们还有很多工作要做。(我们还没有完成所有计划的内容。)我们认真对待 SemVer,这是我们多年来首次有机会清理旧的垃圾,所以我们想充分利用它:)。我们希望在未来几个月发布一个 RC 版本,并在之后不久发布最终版本。
发布说明
rspec-core 2.99.0.beta1
增强功能
- 在示例的上下文中运行的基于块的 DSL 方法(
it
、before(:each)
、after(:each)
、let
和subject
)现在将示例作为块参数进行传递。(David Chelimsky) - 当将多个示例组的名称提交到
include_examples
及其别名时发出警告。(David Chelimsky) - 添加
expose_current_running_example_as
配置选项,供升级过程中使用,当外部 gem 使用已弃用的RSpec::Core::ExampleGroup#example
和RSpec::Core::ExampleGroup#running_example
方法时。(Myron Marston) - 限制弃用消息的冗余性。(Bradley Schaefer, Loren Segal)
- 添加
config.raise_errors_for_deprecations!
选项,该选项将弃用警告转换为错误,以显示调用站点的完整回溯。(Myron Marston)
弃用
- 弃用
RSpec::Core::ExampleGroup#example
和RSpec::Core::ExampleGroup#running_example
方法。如果您需要访问示例(例如,要获取其元数据),请改为使用块参数。(David Chelimsky) - 弃用
autotest/rspec2
,改用rspec-autotest
。(Jon Rowe) - 弃用 RSpec 的内置调试器支持。改用 CLI 选项,例如
-rruby-debug
(用于 ruby-debug gem)或-rdebugger
(用于 debugger gem)。(Myron Marston) - 弃用
config.treat_symbols_as_metadata_keys_with_true_values = false
。RSpec 3 不支持将此选项设置为false
。(Myron Marston) - 弃用在
after(:all)
钩子中访问let
或subject
声明。(Myron Marston, Jon Rowe) - 弃用内置
its
的用法,改为使用rspec-its
gem,因为计划在 RSpec 3 中删除its
。(Peter Alfvin) - 弃用
RSpec::Core::PendingExampleFixedError
,改为使用RSpec::Core::Pending::PendingExampleFixedError
。(Myron Marston) - 弃用
RSpec::Core::Configuration#out
和RSpec::Core::Configuration#output
,改为使用RSpec::Core::Configuration#output_stream
。(Myron Marston) - 以下每个都已弃用,改为使用
register_ordering(:global)
(Myron Marston)RSpec::Core::Configuration#order_examples
RSpec::Core::Configuration#order_groups
RSpec::Core::Configuration#order_groups_and_examples
- 这些已弃用,没有替换,因为在 RSpec 3 中,排序是单个示例组的属性,而不仅仅是整个测试套件的全局属性(Myron Marston)
RSpec::Core::Configuration#order
RSpec::Core::Configuration#randomize?
--order default
已弃用,改为使用--order defined
rspec-core 3.0.0.beta1
重大变更
- 删除对 1.8.6 的显式支持。(Jon Rowe)
- 删除
RSpec::Core::ExampleGroup#example
和RSpec::Core::ExampleGroup#running_example
方法。如果您需要访问示例(例如,要获取其元数据),请改为使用块参数。(David Chelimsky) - 删除
TextMateFormatter
,它已移至rspec-tmbundle
。(Aaron Kromer) - 删除 RCov 集成。(Jon Rowe)
- 删除对 RSpec 1 结构的弃用支持(Myron Marston)
Spec
和Rspec
常量(而不是RSpec
)。Spec::Runner.configure
而不是RSpec.configure
。Rake::SpecTask
而不是RSpec::Core::RakeTask
。
- 删除对
share_as
的弃用支持。(Myron Marston) - 删除
--debug
选项(以及RSpec::Core::Configuration
上的对应选项)。改为使用-r<debugger gem name>
加载您希望使用的任何调试器 gem(例如ruby-debug
、debugger
或pry
)。(Myron Marston) - 将 Autotest 支持提取到一个单独的 gem 中。(Jon Rowe)
- 在
before(:all)
或after(:all)
钩子中访问let
或subject
声明时引发错误。(Myron Marston) - 将
its
支持提取到一个单独的 gem 中。(Peter Alfvin) - 禁止从兄弟上下文使用共享示例组,使它们完全隔离。2.14 和 2.99 允许这样做,但会打印弃用警告。(Jon Rowe)
- 删除
RSpec::Core::Configuration#output
和RSpec::Core::Configuration#out
对RSpec::Core::Configuration#output_stream
的别名。(Myron Marston)
增强功能
- 用 coderay gem 替换维护不善的 syntax gem。(Xavier Shay)
- 配置文件输出中的时间现在为粗体,而不是
failure_color
。(Matthew Boedicker) - 添加
--no-fail-fast
命令行选项。(Gonzalo Rodríguez-Baltanás Díaz) - 在 Drb 下运行时,Runner 现在会考虑本地系统 IP 地址。(Adrian CB)
- JsonFormatter 现在包含
--profile
信息。(Alex / @MasterLambaster) - 始终将作为元数据参数传递的符号视为具有 true 值的哈希键。RSpec 2 支持
treat_symbols_as_metadata_keys_with_true_values
,但现在始终启用此行为。(Myron Marston) - 添加
--dry-run
选项,该选项会在不运行任何示例或钩子的情况下打印套件的格式化程序输出。(Thomas Stratmann, Myron Marston) - 记录 RSpec 生成的
spec_helper.rb
文件中的配置选项和默认值。(Parker Selbert) - 为生成的示例组类提供一个友好的名称,该名称从文档字符串派生,而不是类似“Nested_2”的名称。(Myron Marston)
- 避免在洗牌示例时影响用户代码的随机化,以便用户可以依靠自己的种子正常工作。(Travis Herrick)
弃用
treat_symbols_as_metadata_keys_with_true_values
已弃用,不再有任何影响,因为现在始终启用它启用的行为。(Myron Marston)
rspec-mocks 2.99.0.beta1
弃用
- 期望对具有不匹配参数的存根方法使用 lambda 或其他强参数实现已弃用,对它们的支持将在 3.0 中删除。请提供正确数量的参数或使用弱参数实现(具有 splat 或 proc 的方法)。(Jon Rowe)
- 在多个示例中使用相同的测试替身实例已弃用。测试替身仅用于一个示例。模拟和存根始终在示例之间重置;但是,在 2.x 中,
as_null_object
状态没有重置,一些用户依赖它来拥有一个用于多个示例的空对象替身。此行为将在 3.0 中删除。(Myron Marston) - 当新的
yield_receiver_to_any_instance_implementation_blocks
配置选项未明确设置时,使用any_instance
实现块时会打印详细的警告,因为 RSpec 3.0 将默认启用此新功能。(Sam Phippen)
增强功能
- 添加一个配置选项,将接收者传递给
any_instance
实现块。(Sam Phippen)
rspec-mocks 3.0.0.beta1
重大变更
- 如果使用
should_not_receive(...).and_return
,则会引发显式错误。(Sam Phippen) - 删除 1.8.6 解决方案。(Jon Rowe)
- 删除
stub!
和unstub!
。(Sam Phippen) - 删除
mock(name, methods)
和stub(name, methods)
,留下double(name, methods)
用于创建测试替身。(Sam Phippen, Michi Huber) - 删除
any_number_of_times
,因为should_receive(:msg).any_number_of_times
实际上是模拟中的存根。(Sam Phippen) - 删除对在多个示例中重复使用相同空对象测试替身的支持。测试替身旨在仅用于一个示例。(Myron Marston)
- 使
at_least(0)
引发错误。(Sam Phippen) - 删除对
require 'spec/mocks'
的支持,该支持一直保留以向后兼容 RSpec 1。(Myron Marston) - 提供给
with
的块始终用作实现。(Xavier Shay) - 将接收者传递给
any_instance
实现块的配置选项(在 2.99 中添加)现在默认设置为“on”。(Sam Phippen)
增强功能
- 允许
have_received
匹配器使用块对参数设置进一步的期望。(Tim Cowlishaw) - 提供
instance_double
和class_double
来创建验证替身,从rspec-fire
移植而来。(Xavier Shay) - 验证替身上的
as_null_object
仅响应定义的方法。(Xavier Shay) - 提供
object_double
来创建特定对象实例的经过验证的副本。(Xavier Shay) - 提供
verify_partial_doubles
配置,该配置在部分模拟上提供类似object_double
的验证行为。(Xavier Shay) - 改进了双重创建的性能,特别是那些具有许多属性的双重创建。(Xavier Shay)
- 可以配置常量存根的
transfer_nested_constants
选项的默认值。(Xavier Shay) - 可以通过
receive_messages(:message => :value)
批量允许或预期消息。(Jon Rowe) allow(Klass.any_instance)
和expect(Klass.any_instance)
现在会打印警告。这通常是一个错误,用户通常想要allow_any_instance_of
或expect_any_instance_of
代替。(Sam Phippen)- 如果底层模块已加载,并且调用的方法的元数与实际实现的方法的元数不匹配,则
instance_double
和class_double
会引发ArgumentError
。(Andy Lindeman) - 间谍现在可以检查它们的调用顺序是否正确。(Jon Rowe)
弃用
- 在没有明确配置的情况下使用旧的
:should
语法已弃用。如果您没有明确启用它,它将继续工作,但在 RSpec 3 中会发出弃用警告。(Sam Phippen)
错误修复
- 修复
and_call_original
以处理涉及单例类祖先的复杂边缘情况。(Marc-André Lafortune,Myron Marston) - 当为意外参数生成错误消息时,如果
#description
返回nil
或''
,则使用#inspect
而不是#description
,以便您仍然可以获得有用的消息。(Nick DeLuca)
rspec-expectations 2.99.0.beta1
弃用
- 弃用
have
、have_at_least
和have_at_most
。您可以通过https://github.com/rspec/rspec-collection_matchers继续使用这些匹配器,或者您可以使用类似expect(your_object.size).to eq(num)
的方式重写您的期望。(Hugo Baraúna) - 弃用
be_xyz
谓词匹配器,当xyz?
是一个私有方法时。(Jon Rowe) - 弃用
be_true
/be_false
,支持be_truthy
/be_falsey
(用于 Ruby 的条件语义)或be true
/be false
(用于精确相等)。(Sam Phippen) - 弃用从自定义匹配器中使用错误范围调用辅助方法。(Myron Marston)
def self.foo
/extend Helper
可用于添加宏方法(例如,调用自定义匹配器 DSL 方法的方法),但不应用于定义从 DSL 块中调用的辅助方法。def foo
/include Helper
恰恰相反:它是用于从 DSL 块中调用的辅助方法,而不是用于定义宏。- RSpec 2.x 允许以这两种方式定义的辅助方法用于任何目的,但 RSpec 3.0 不会。
rspec-expectations 3.0.0.beta1
重大变更
- 删除对 1.8.6 的显式支持。(Jon Rowe)
- 删除弃用的
be_close
匹配器,支持be_within
代替。(Sam Phippen) - 将
be_true
和be_false
重命名为be_truthy
和be_falsey
。(Sam Phippen) - 使
expect { }.to_not raise_error(SomeSpecificClass, message)
、expect { }.to_not raise_error(SomeSpecificClass)
和expect { }.to_not raise_error(message)
无效,因为它们容易隐藏故障。相反,使用expect { }.to_not raise_error
(不带参数)。(Sam Phippen) - 在
RSpec::Matchers.define
块中,通过def self.helper
或extend HelperModule
提供的辅助方法不再可用于match
块(或任何其他块)。相反,包含您的辅助模块并定义辅助方法作为实例方法。(Myron Marston)
增强功能
- 支持
raise_error
匹配器使用do..end
风格的块。(Yuji Nakayama) - 重写了自定义匹配器 DSL 以简化其实现并解决一些问题。(Myron Marston)
- 允许从自定义匹配器 DSL 块中提前
return
。(Myron Marston) - 自定义匹配器 DSL 的
chain
现在可以接受一个块。(Myron Marston) - 支持通过链式
with_message
方法调用在raise_error
匹配器上设置期望。(Sam Phippen)
错误修复
- 允许在 DSL 定义的自定义匹配器的
match
块中使用include
和match
匹配器。(Myron Marston)
弃用
- 在没有明确配置的情况下使用旧的
:should
语法已弃用。如果您没有明确启用它,它将继续工作,但在 RSpec 3 中会发出弃用警告。(Sam Phippen)
rspec-rails 2.99.0.beta1
弃用
- 弃用自动测试集成,支持
rspec-autotest
gem。(Andy Lindeman)
增强功能
- 支持 Rails 4.1 和 Minitest 5。(Patrick Van Stee)
错误修复
- 修复当启用
--warnings
时由控制器规范引发的“警告:实例变量@orig_routes 未初始化”。(Andy Lindeman) - 尽可能地,根据 ActiveRecord 的版本进行检查,而不是 Rails 的版本。可以使用部分 rspec-rails,而无需使用全部 Rails。(Darryl Pogue)
- 显式依赖
activemodel
。这允许不引入全部rails
的库使用rspec-rails
。(John Firebaugh)
rspec-rails 3.0.0.beta1
重大变更
- 将
autotest
和autotest-rails
支持提取到rspec-autotest
gem 中。(Andy Lindeman)
[^foot_1]: 但是,有一个注意事项:我们只将它视为一个错误,因为您的测试套件使用了 RSpec API 的文档。Ruby 的动态特性使得 RSpec 可以以我们无法支持的方式使用。