RSpec 2.14 发布!
Myron Marston
2013 年 7 月 8 日我们刚刚发布了 RSpec 2.14。它将是最后一个 2.x 版本的特性发布,建议所有用户升级。我们已经开始着手 RSpec 3。下周我会在博客上发布有关 RSpec 3 计划的文章,敬请关注:)。
感谢所有为此次 RSpec 发布做出贡献的贡献者。
值得注意的新特性
核心:剖析器现在也可以剖析示例组
RSpec 长期以来一直拥有 --profile
选项,用于在结束时转储前 N 个最慢的示例。在 RSpec 2.14 中,此功能得到了增强,因此它会打印平均示例时间最长的组。例如,以下是使用 --profile 5
对 rspec-core 的套件进行剖析后输出的结果
Top 5 slowest examples (0.38945 seconds, 10.8% of total time):
RSpec::Core::Formatters::TextMateFormatter produces HTML identical to the one we designed manually
0.10471 seconds ./spec/rspec/core/formatters/text_mate_formatter_spec.rb:64
::DRbCommandLine --drb-port without RSPEC_DRB environment variable set sets the DRb port
0.07461 seconds ./spec/rspec/core/drb_command_line_spec.rb:39
RSpec::Core::Runner#run with --drb or -X and a DRb server is running builds a DRbCommandLine and runs the specs
0.0744 seconds ./spec/rspec/core/runner_spec.rb:47
command line when a custom order is configured orders the groups and examples by the provided strategy
0.06924 seconds ./spec/command_line/order_spec.rb:169
RSpec::Core::ConfigurationOptions#configure sends pattern before files_or_directories_to_run
0.06649 seconds ./spec/rspec/core/configuration_options_spec.rb:48
Top 5 slowest example groups:
RSpec::Core::Formatters::HtmlFormatter
0.05861 seconds average (0.05861 seconds / 1 example) ./spec/rspec/core/formatters/html_formatter_spec.rb:9
RSpec::Core::Formatters::TextMateFormatter
0.05713 seconds average (0.1714 seconds / 3 examples) ./spec/rspec/core/formatters/text_mate_formatter_spec.rb:9
command line
0.05218 seconds average (0.31307 seconds / 6 examples) ./spec/command_line/order_spec.rb:3
::DRbCommandLine
0.02016 seconds average (0.16127 seconds / 8 examples) ./spec/rspec/core/drb_command_line_spec.rb:4
RSpec::Core::Runner
0.01822 seconds average (0.10931 seconds / 6 examples) ./spec/rspec/core/runner_spec.rb:5
核心:新的 --warnings
标志用于启用 Ruby 的警告模式
现在,您可以传递 --warnings
或 -w
标志来启用 ruby 的警告模式。
核心:共享示例组的范围限定为定义它们的上下文
在 2.14 之前,共享示例组存储在一个全局哈希表中,可以在任何上下文中定义,也可以从任何上下文中使用。在 2.14 中,这种情况发生了改变:共享示例组的范围现在限定为定义它们的上下文。这意味着您现在可以执行以下操作
describe MySinatraApp1 do
shared_examples_for "error handling" do
# some examples would go here
end
context 'GET to /foo' do
include_examples "error handling"
end
context 'GET to /bar' do
include_examples "error handling"
end
end
describe MySinatraApp2 do
shared_examples_for "error handling" do
# some different examples would go here
end
context 'GET to /foo' do
include_examples "error handling"
end
context 'GET to /bar' do
include_examples "error handling"
end
end
这里有两个不同的 "error handling"
共享示例组,每个示例组的范围限定为(并从)不同的示例组。如这里所示,共享示例组可从定义它们的上下文或从任何嵌套上下文访问。在 2.14 中,在兄弟上下文中声明的共享示例组仍然可供使用以保持向后兼容性,但会打印弃用警告。在 3.0 中,您将无法使用在兄弟上下文中定义的共享示例组。
核心:弃用输出现在可配置
RSpec 2.14 已经弃用了一些内容,以便在 3.0 中删除。为了帮助减少由于弃用数量增加而导致的噪音,出现了一个新的选项,可以将弃用警告定向到文件
# spec_helper.rb
RSpec.configure do |rspec|
rspec.deprecation_stream = 'log/deprecations.log'
# or
rspec.deprecation_stream = File.open("/path/to/file", "w")
end
通常,弃用警告会被打印到 stderr
。当您配置此选项时,它会将弃用警告发送到已配置的文件,并在规格运行结束时打印类似以下的信息
2 deprecations logged to log/deprecations.log
模拟:新的消息期望语法
在 RSpec 2.11 中,我们在 rspec-expectations 中添加了新的语法,该语法不再依赖于猴子补丁,从而避免了与代理对象相关的某些问题。在 RSpec 2.14 中,我们将相同的语法扩展到了 rspec-mocks
mailer = double("Mailer")
# old syntax:
mailer.stub(:deliver_welcome_email)
mailer.should_receive(:deliver_welcome_email).with(an_instance_of(User))
# new syntax
allow(mailer).to receive(:deliver_welcome_email)
expect(mailer).to receive(:deliver_welcome_email).with(an_instance_of(User))
有关更多详细信息,请阅读 Sam Phippen 在 2.14.0.rc1 版本发布时发布的 公告博客文章。
模拟:间谍
来自 Thoughtbot 的 Joe Ferris 实施了此新特性。传统上,rspec-mocks 要求您在收到消息之前设置消息期望
mailer = double("Mailer")
expect(mailer).to receive(:deliver_welcome_email).with(an_instance_of(User))
UserCreationService.new(mailer).create_user(params)
在某些情况下,此顺序感觉反了(特别是如果您尝试使用安排/操作/断言模式组织测试)。间谍允许您在事后断言消息已收到
mailer = double("Mailer", deliver_welcome_email: nil)
UserCreationService.new(mailer).create_user(params)
expect(mailer).to have_received(:deliver_welcome_email).with(an_instance_of(User))
请注意,您首先必须对您稍后将期望的消息进行存根,以便 rspec-mocks 可以监视它。(对于 rspec-mocks 来说,没有可行的高效方法可以自动监视发送到所有对象的任何方法调用)。或者,您可以创建一个测试双重作为空对象(使用 double().as_null_object
),这将对发送到该对象的所有消息进行自动间谍
mailer = double("Mailer").as_null_object
UserCreationService.new(mailer).create_user(params)
expect(mailer).to have_received(:deliver_welcome_email).with(an_instance_of(User))
文档
RDoc
- http://rubydoc.info/gems/rspec-core
- http://rubydoc.info/gems/rspec-expectations
- http://rubydoc.info/gems/rspec-mocks
- http://rubydoc.info/gems/rspec-rails
Cucumber 特性
- http://relishapp.com/rspec/rspec-core
- http://relishapp.com/rspec/rspec-expectations
- http://relishapp.com/rspec/rspec-mocks
- http://relishapp.com/rspec/rspec-rails
发行说明
rspec-core 2.14.0
增强功能
- 改进了 Git Bash 内部对 Windows 的检测,以更好地处理
--color
。 - 将最慢示例组的剖析添加到
--profile
选项中。输出按最慢的平均示例组排序。 - 如果出现故障且使用
--fail-fast
和--profile
选项,则不会显示慢速示例(Paweł Gościcki)。 - 不要总是将
spec
添加到加载路径中,而将配置的--default-path
添加到加载路径中(默认为spec
)。这更好地支持那些选择将他们的规格放在其他目录中的人(John Feminella)。 - 添加一些逻辑来测试时间持续时间精度。使其成为时间的函数,随着时间的增加降低精度。(Aaron Kromer)
- 添加新的
backtrace_inclusion_patterns
配置选项。与这些模式之一匹配的回溯行将始终包含在回溯中,即使它们也与排除模式匹配(Sam Phippen)。 - 使用
-
在解析.rspec
作为 ERB 时支持 ERB 修剪模式(Gabor Garami)。 - 在没有块的情况下调用 let 和 subject 时给出更好的错误消息。(Sam Phippen)。
- 在配置文档中列出
.rspec-local
的优先级(Sam Phippen) - 在
--pattern
选项中支持{a,b}
shell 扩展语法(Konstantin Haase)。 - 为 –require 命令行选项添加 Cucumber 文档(Bradley Schaefer)
- 通过 config 公开配置选项
config.libs
返回配置为添加到加载路径的 libsfull_backtrace?
返回回溯清理器的状态debug?
当调试器已加载时返回 trueline_numbers
返回我们正在过滤的行号(如果有)full_description
返回用于过滤描述的正则表达式(Jon Rowe)
- 为 RSpec.world 和 RSpec.configuration 添加 setter(Alex Soulim)
- 使用
--warnings
配置 ruby 的警告行为(Jon Rowe) - 修复了在旧版本的
1.8.7
上出现的一个模糊问题,其中Time.dup
不允许访问Time.now
(Jon Rowe) - 使
shared_examples_for
成为上下文感知的,以便键可以在多个上下文中安全地重复使用而不会发生冲突。(Jon Rowe) - 添加可配置的
deprecation_stream
(Jon Rowe) - 通过格式化程序发布弃用(David Chelimsky)
- 将焦点应用于使用
fit
定义的示例(相当于it "description", focus: true
)(Michael de Silva)
错误修复
- 使 JSON 格式化程序在处理
--profile
时与文本格式化程序保持一致(Paweł Gościcki)。 - 修复了命名主题,以便如果内部组定义了一个覆盖命名方法的方法,
subject
仍然保留最初声明的值(Myron Marston)。 - 修复了随机排序,使其不会导致嵌套兄弟上下文中示例中的
rand
返回相同的值(Max Shytikov)。 - 使用新的
backtrace_inclusion_patterns
配置选项来确保那些在与默认排除模式之一匹配的目录(例如gems
)中开发代码的人仍然可以获得正常的回溯过滤(Sam Phippen)。 - 修复了
before
钩子的排序,以便在RSpec.configure
中声明的before
钩子在共享上下文中声明的before
钩子之前运行(Michi Huber 和 Tejas Dinkar)。 - 修复了
Example#full_description
,使其在没有提供文档字符串时由最后一个匹配器描述填充(如Example#description
已经做的那样)(David Chelimsky)。 - 修复了记忆方法(
let
和subject
)泄漏define_method
作为public
方法。(Thomas Holmes 和 Jon Rowe)(#873) - 修复了来自测试套件的警告。(Pete Higgins)
- 确保由
let
定义的方法在发生名称冲突时优先于其他方法(例如,来自包含的模块)。(Jon Rowe、Andy Lindeman 和 Myron Marston)
弃用
- 弃用
Configuration#backtrace_clean_patterns
,支持Configuration#backtrace_exclusion_patterns
,以提高一致性和与新的backtrace_inclusion_patterns
配置选项的对称性(Sam Phippen)。 - 弃用
Configuration#requires=
,支持使用 ruby 的require
。由命令行指定的必需项仍然可以通过Configuration#require
读取器访问。(Bradley Schaefer) - 弃用跨兄弟上下文调用
SharedExampleGroups
(Jon Rowe)
rspec-expectations 2.14.0
增强功能
- 增强
yield_control
,以便您可以指定确切或相对的次数:expect { }.to yield_control.exactly(3).times
、expect { }.to yield_control.at_least(2).times
等(Bartek Borkowski)。 - 使在期望失败时使用的差异程序能够更好地处理数组,方法是将数组的每个元素拆分为单独的行。(Sam Phippen)
- 接受对
:to_str
有响应的鸭子类型字符串作为期望消息。(Toby Ovod-Everett)
错误修复
- 修复差异程序,使其在处理不同编码的字符串时不会引发错误(Jon Rowe)。
- 修复
expect(something).to be_within(x).percent_of(y)
,其中 x 和 y 都是整数(Sam Phippen)。 - 修复
have
匹配器,使其能够处理在 ruby 2.0 上,Enumerator#size
可能返回 nil 的情况(Kenta Murata)。 - 修复
expect { raise s }.to raise_error(s)
,其中 s 是 ruby 2.0 上的错误实例(Sam Phippen)。 - 修复了
expect(object).to raise_error
通过。现在,它会向用户发出警告并使规格失败(tomykaira)。 - 不是匹配器的值使用
#inspect
而不是#description
来进行文档输出(Andy Lindeman、Sam Phippen)。 - 使
expect(a).to be_within(x).percent_of(y)
能够使用负 y(Katsuhiko Nishimra)。 - 使
be_predicate
匹配器能够与expect{...}.to change...
一起使用,效果如预期(Sam Phippen)。
弃用
- 弃用
expect { }.not_to raise_error(SpecificErrorClass)
或expect { }.not_to raise_error("some specific message")
。使用这些方法很容易隐藏失败,因为它们会允许任何其他错误通过。(Sam Phippen 和 David Chelimsky)
rspec-mocks 2.14.0
增强功能
- 重构内部结构,以便模拟代理方法和状态保存在被模拟对象之外,而不是在被模拟对象内部。这为将来的语法增强铺平了道路,并消除了对某些针对
any_instance
复制和YAML
序列化等内容的hacky 解决方法的需要。请注意,代码现在依赖于__id__
为要模拟或存根的任何对象返回唯一的、一致的值(Myron Marston)。 - 添加对测试间谍的支持。这允许您使用
have_received
匹配器在事后验证消息是否已收到。请注意,您必须先对方法进行存根或使用空双重。(Joe Ferris 和 Joël Quenneville) - 使
at_least
和at_most
样式的接收期望能够打印出它们期望的至少或至多调用次数,而不是仅仅打印期望中给定的调用次数(Sam Phippen) - 使
with
样式的接收期望能够打印出它们期望的 args 和它们获取的 args(Sam Phippen) - 修复了 ruby 2.0.0p0 中出现的一些警告(Sam Phippen)。
- 为消息期望添加新的
:expect
语法(Myron Marston 和 Sam Phippen)。 - 在自述文件中记录测试间谍。(Adarsh Pandit)
- 添加
array_including
匹配器。(Sam Phippen) - 为模拟或存根方法添加一个与语法无关的 API。这旨在供诸如 rspec-rails 之类的库使用,这些库需要模拟或存根方法,并且无论用户配置的语法如何都可以工作(Paul Annesley、Myron Marston 和 Sam Phippen)。
错误修复
- 修复
any_instance
,以便当使用any_instance
对该类型的方法进行了存根时,可以对冻结对象进行dup
(Jon Rowe)。 - 修复
and_call_original
,以便它在传递了错误数量的 args 时正确引发ArgumentError
(Jon Rowe)。 - 修复 1.9.2 上的
double
,以便您可以使用Array(my_double)
将它们包装在数组中(Jon Rowe)。 - 修复
stub_const
和hide_const
,使其能够处理重新定义send
的常量(Sam Phippen)。 - 修复
Marshal.dump
扩展,使其能够正确处理nil。(Luke Imhoff,Jon Rowe) - 修复
allow_message_expectations_on_nil
的隔离问题。(Jon Rowe) - 使用inspect格式化失败消息中期望中的实际参数(#280,Ben Langfeld)
- 防止测试替身初始化不当(#293)(Joseph Shraibman 和 Jon Rowe)
- 修复
double
,使其无论配置的语法如何都能正确设置传递的存根(Paul Annesley)。 - 允许将代码块实现与
and_yield
、and_raise
、and_return
或and_throw
组合使用。此问题在 2.13.1 中已修复,但未能合并到 2.14.0.rc1 版本的主分支中(Myron Marston)。 - 当 rspec-mocks 未完全初始化时,
Marshal.dump
不会不必要地复制对象。这可能会在使用spork
或类似预加载gem时导致错误(Andy Lindeman)。
弃用
- 弃用
stub
和mock
作为double
的别名。double
是创建测试替身的最佳术语,并且只使用一个术语可以减少混淆(Michi Huber)。 - 弃用
stub!
和unstub!
,支持stub
和unstub
(Jon Rowe)。 - 弃用
at_least(0).times
和any_number_of_times
(Michi Huber)。
rspec-rails 2.14.0
增强功能
- 通过更新适配器以支持 Minitest 5.0 来初步支持 Rails 4.1。(Andy Lindeman)
错误修复
- Rake 任务不定义可能与其他库交互的方法。(Fujimura Daisuke)
- 在 rspec-core 中上游修复问题后,恢复了对控制器规范中顺序错误的
let
定义的修复。(Andy Lindeman) - 修复了在 Rails 4 中使用
expect(Model).to have(n).records
时出现的弃用警告。(Andy Lindeman) - 当规范文件存在于 spec/ 目录的顶层时,
rake stats
运行正确。(Benjamin Fleischer)