RSpec 3.3 已发布!
Myron Marston
2015年6月12日RSpec 3.3 刚刚发布!鉴于我们对语义版本控制的承诺,对于已经使用 RSpec 3.0、3.1 或 3.2 的任何人来说,这应该是一个简单的升级,但如果我们引入了任何回归,请告诉我们,我们会尽快发布一个补丁版本来修复。
RSpec 仍然是一个社区驱动的项目,来自世界各地的贡献者参与其中。此版本包含来自近 50 位不同贡献者的 769 次提交和 200 个合并的拉取请求!
感谢所有帮助完成此版本的人!
主要变更
核心:每个示例和示例组的唯一 ID
历史上,RSpec 示例主要通过文件位置进行标识。例如,以下命令
$ rspec spec/unit/baseball_spec.rb:23
…将运行在 spec/unit/baseball_spec.rb
文件的第 23 行定义的示例或示例组。基于位置的标识通常效果很好,但并不总是能唯一地标识特定示例。例如,如果您使用共享示例,您的规范套件可能在 spec/support/shared_examples.rb:47
定义了示例的多个副本。
RSpec 3.3 引入了一种新的方法来标识示例和示例组:唯一 ID。ID 针对特定文件进行范围限定,并基于示例或组的索引。例如,以下命令
$ rspec spec/unit/baseball_spec.rb[1:2,1:4]
…将运行在 spec/unit/baseball_spec.rb
文件中定义的第一个顶层组下的第 2 个和第 4 个示例或组。
在大多数情况下,新的示例 ID 主要在 RSpec 内部使用,以支持一些新的 3.3 功能,但您可以从命令行使用它们。RSpec 为每个失败打印的重新运行命令将使用它们(如果文件位置不能唯一地识别失败的示例)。现在,复制粘贴特定失败示例的重新运行命令将始终只运行该示例!
核心:新的 --only-failures
选项
现在 RSpec 拥有了一种强大的方法来唯一地识别每个示例,我们添加了新的过滤功能,允许您只运行失败的示例。要启用此功能,您首先需要配置 RSpec,使其知道在哪里持久化每个示例的状态
RSpec.configure do |c|
c.example_status_persistence_file_path = "./spec/examples.txt"
end
配置完成后,RSpec 将在每次运行套件后开始持久化每个示例的状态。您可能需要将此文件添加到 .gitignore
(或您的源代码控制系统的等效项),因为它不应被纳入源代码控制。配置完成后,您可以使用新的 CLI 选项
$ rspec --only-failures
# or apply it to a specific file or directory:
$ rspec spec/unit --only-failures
值得注意的是,此选项仅过滤上次运行失败的示例,而不是仅过滤上次运行 rspec
的失败。这意味着,例如,如果有一个您通常不会在本地运行的缓慢的验收规范(将其留给您的 CI 服务器运行),并且它上次在本地运行时失败,即使是在几周前,当您运行 rspec --only-failures
时,它也会被包含在内。
请参阅我们的relish 文档,了解此功能的端到端示例。
核心:新的 --next-failure
选项
当进行导致规范套件出现许多错误的更改时(例如重命名一个常用的方法),我经常使用一个特定的工作流程
- 运行整个套件以获取错误列表。
- 使用 RSpec 打印的重新运行命令,依次运行每个错误,在继续下一个错误之前修复每个示例。
这允许我系统地处理所有错误,而不必反复运行整个套件。RSpec 3.3 包含一个新选项,可以大大简化此工作流程
$ rspec --next-failure
# or apply it to a specific file or directory:
$ rspec spec/unit --next-failure
此选项等效于 --only-failures --fail-fast --order defined
。它只过滤错误,并在第一个错误发生时中止。它应用 --order defined
以确保您在没有修复示例的情况下多次运行它时,始终获得相同的失败示例。
核心:稳定的随机排序
RSpec 的随机排序一直允许您传递特定的 --seed
以按与先前运行相同的顺序运行套件。但是,这仅在您运行与原始运行相同的示例集时才有效。如果您将种子应用于示例的子集,它们的排序相对于彼此不一定是一致的。这是 Array#shuffle
工作方式的结果:%w[ a b c d ].shuffle
可能将 c
排列在 b
之前,但即使您使用相同的随机种子,%w[ b c d ].shuffle
仍可能将 c
排列在 b
之后。
这可能看起来并不重要,但它使 --seed
的用处大打折扣。当您尝试追踪排序依赖关系的来源时,您必须不断运行整个套件才能重现错误。
RSpec 3.3 解决了这个问题。我们不再使用 shuffle
进行随机排序。相反,我们将 --seed
值与每个示例的 id 组合在一起,对其进行哈希运算,并按生成的数值进行排序。这确保了,如果特定种子将示例 c
排列在示例 b
之前,无论您运行的是套件的哪个子集,当您重新使用该种子时,c
始终在 b
之前。
虽然稳定的随机排序本身很有用,但真正重要的在于它启用的一个新功能:二分查找。
核心:二分查找
自 RSpec 2.8 以来,RSpec 一直支持随机排序(使用 --seed
选项来重现特定排序)。这些功能有助于发现规范之间的排序依赖关系,您需要快速隔离并修复这些依赖关系。
不幸的是,RSpec 提供的隔离排序依赖关系的帮助很少。在 RSpec 3.3 中,情况正在发生变化。我们现在提供了一个 --bisect
选项,它可以将排序依赖关系缩小到最小的重现情况。新的二分查找标志会重复运行套件的子集,以隔离在运行整个套件时重现相同错误的最小示例集。
稳定的随机排序使您能够运行套件的各种子集,以尝试将排序依赖关系缩小到最小的重现情况。
请参阅我们的relish 文档,了解此功能的端到端示例。
核心:线程安全的 let
和 subject
历史上,let
和 subject
从不线程安全。这在 RSpec 3.3 中发生了改变,这要归功于 Josh Cheek 的出色工作。
请注意,线程安全同步会增加一些开销,正如您所期望的那样。如果您在示例中没有启动任何线程,并且希望避免这种开销,您可以配置 RSpec 禁用线程安全性。
预期:新的 aggregate_failures
API
当您需要对特定结果进行多个独立的预期时,通常有两个方法可以选择。一种方法是为每个预期定义一个单独的示例
RSpec.describe Client do
let(:response) { Client.make_request }
it "returns a 200 response" do
expect(response.status).to eq(200)
end
it "indicates the response body is JSON" do
expect(response.headers).to include("Content-Type" => "application/json")
end
it "returns a success message" do
expect(response.body).to eq('{"message":"Success"}')
end
end
这遵循“每个示例一个预期”的准则,鼓励您让每个规范专注于行为的一个方面。或者,您可以将所有预期放在一个示例中
RSpec.describe Client do
it "returns a successful JSON response" do
response = Client.make_request
expect(response.status).to eq(200)
expect(response.headers).to include("Content-Type" => "application/json")
expect(response.body).to eq('{"message":"Success"}')
end
end
后一种方法将更快,因为请求只执行一次,而不是三次。但是,如果状态码不是 200,则示例将在第一个预期处中止,您将无法看到后面两个预期是否通过。
RSpec 3.3 具有一个新功能,可以帮助您在出于速度或其他原因需要将多个预期放在一个示例中时。只需将预期包含在一个 aggregate_failures
块中
RSpec.describe Client do
it "returns a successful JSON response" do
response = Client.make_request
aggregate_failures "testing response" do
expect(response.status).to eq(200)
expect(response.headers).to include("Content-Type" => "application/json")
expect(response.body).to eq('{"message":"Success"}')
end
end
end
在 aggregate_failures
块中,预期错误不会导致示例中止。相反,将在最后引发一个单一的聚合异常,其中包含多个子错误,RSpec 会为您很好地格式化它们
1) Client returns a successful response
Got 3 failures from failure aggregation block "testing reponse".
# ./spec/client_spec.rb:5
1.1) Failure/Error: expect(response.status).to eq(200)
expected: 200
got: 404
(compared using ==)
# ./spec/client_spec.rb:6
1.2) Failure/Error: expect(response.headers).to include("Content-Type" => "application/json")
expected {"Content-Type" => "text/plain"} to include {"Content-Type" => "application/json"}
Diff:
@@ -1,2 +1,2 @@
-[{"Content-Type"=>"application/json"}]
+"Content-Type" => "text/plain",
# ./spec/client_spec.rb:7
1.3) Failure/Error: expect(response.body).to eq('{"message":"Success"}')
expected: "{\"message\":\"Success\"}"
got: "Not Found"
(compared using ==)
# ./spec/client_spec.rb:8
RSpec::Core
通过使用元数据为此功能提供了改进的支持。无需将预期与 aggregate_failures
结合在一起,只需使用 :aggregate_failures
标记示例或组
RSpec.describe Client, :aggregate_failures do
it "returns a successful JSON response" do
response = Client.make_request
expect(response.status).to eq(200)
expect(response.headers).to include("Content-Type" => "application/json")
expect(response.body).to eq('{"message":"Success"}')
end
end
如果您想在所有地方启用此功能,可以使用 define_derived_metadata
RSpec.configure do |c|
c.define_derived_metadata do |meta|
meta[:aggregate_failures] = true unless meta.key?(:aggregate_failures)
end
end
当然,您可能不希望在所有地方默认启用此功能。unless meta.key?(:aggregate_failures)
部分允许您通过使用 aggregate_failures: false
标记它们来选择退出单个示例或组。当您有依赖预期(例如,某个预期只有在先前预期通过时才有意义),或者如果您使用预期来表达先决条件时,您可能希望示例在预期失败时立即中止。
预期:改进的错误输出
RSpec 3.3 包含所有匹配器的错误消息的全面改进。测试双重现在在我们的错误消息中看起来更漂亮
Failure/Error: expect([foo]).to include(bar)
expected [#<Double "Foo">] to include #<Double "Bar">
Diff:
@@ -1,2 +1,2 @@
-[#<Double "Bar">]
+[#<Double "Foo">]
此外,RSpec 对 Time
和其他对象的改进格式现在将用于检查这些对象的位置,无论您使用了哪个内置匹配器。因此,例如,您以前会得到
Failure/Error: expect([Time.now]).to include(Time.now)
expected [2015-06-09 07:48:06 -0700] to include 2015-06-09 07:48:06 -0700
…现在您将得到
Failure/Error: expect([Time.now]).to include(Time.now)
expected [2015-06-09 07:49:16.610635000 -0700] to include 2015-06-09 07:49:16.610644000 -0700
Diff:
@@ -1,2 +1,2 @@
-[2015-06-09 07:49:16.610644000 -0700]
+[2015-06-09 07:49:16.610635000 -0700]
…这使得时间对象在亚秒级别上的差异更加清晰。
感谢 Gavin Miller、Nicholas Chmielewski 和 Siva Gollapalli 对这些改进的贡献!
模拟:改进的错误输出
RSpec::Mocks 也对其错误输出进行了一些改进。RSpec 对 Time
和其他对象的改进格式现在也应用于模拟预期错误
Failure/Error: dbl.foo(Time.now)
#<Double (anonymous)> received :foo with unexpected arguments
expected: (2015-06-09 08:33:36.865827000 -0700)
got: (2015-06-09 08:33:36.874197000 -0700)
Diff:
@@ -1,2 +1,2 @@
-[2015-06-09 08:33:36.865827000 -0700]
+[2015-06-09 08:33:36.874197000 -0700]
此外,have_received
的错误输出已得到很大改进,因此当预期参数不匹配时,它会列出每组实际参数,以及使用这些参数接收消息的次数
Failure/Error: expect(dbl).to have_received(:foo).with(3)
#<Double (anonymous)> received :foo with unexpected arguments
expected: (3)
got: (1) (2 times)
(2) (1 time)
感谢 John Ceh 实施了后一项改进!
模拟:模拟 MyClass.new
验证 MyClass#initialize
RSpec 的验证双重使用 Ruby 反射功能提供的元数据来验证,除其他事项外,传递的参数是否根据原始方法的签名有效。但是,当使用仅一个参数 splat 定义方法时
def method_1(*args)
method_2(*args)
end
def method_2(a, b)
end
…那么验证双重将允许任何参数,即使该方法只是委派给另一个具有严格签名的方法。不幸的是,Class#new
是其中一个方法。它由 Ruby 定义为委派给 #initialize
,并且只接受 initialize
签名可以处理的参数,但 MyClass.method(:new).parameters
提供的元数据表明它可以处理任何参数,即使它无法处理。
在 RSpec 3.3 中,我们改进了验证双重,因此当您在类上模拟 new
时,它使用 #initialize
的方法签名来验证参数,除非您重新定义了 new
以执行其他操作。这使验证双重能够在您向模拟的 MyClass#new
方法传递真实类不允许的参数时,为您提供错误。
Rails:生成的脚手架路由规范现在包含 PATCH 规范
Rails 4 添加了对 PATCH
的支持,将其作为更新的主要 HTTP 方法。rspec-rails 中的路由匹配器从 2.14 版本开始也支持 PATCH
,但生成的脚手架规范没有更新以匹配。这个问题已在 rspec-rails 3.3 中得到 解决。
感谢 Igor Zubkov 的改进!
Rails:新的 :job
规范类型
现在 ActiveJob
已成为 Rails 的一部分,rspec-rails 拥有新的 :job
规范类型,您可以通过以下两种方式选择使用它:在您的示例组中添加标签 :type => :job
,或者将规范文件放在 spec/jobs
目录下(如果您启用了 infer_spec_type_from_file_location!
)。
感谢 Gabe Martin-Dempesy 的改进!
统计数据
综合
- 总提交次数: 769
- 合并的拉取请求: 200
- 49 位贡献者:Aaron Kromer, Alex Kwiatkowski, Andrey Botalov, Anton Davydov, Ben Axnick, Benjamin Fleischer, Bradley Schaefer, ChrisArcand, David Daniell, Denis Laliberté, Eugene Kenny, Fabian Wiesel, Fabien Schurter, Fabio Napoleoni, Gabe Martin-Dempesy, Gavin Miller, Igor Zubkov, Jared Beck, Jean van der Walt, Joe Grossberg, Johannes Gorset, John Ceh, Jon Rowe, Josh Cheek, Leo Arnold, Lucas Mazza, Mark Swinson, Mauricio Linhares, Melissa Xie, Myron Marston, Nicholas Chmielewski, Nicholas Henry, Orien Madgwick, Pavel Shpak, Raymond Sanchez, Ryan Mulligan, Ryan Ong, Sam Phippen, Samnang Chhun, Samuel Esposito, Siva Gollapalli, Tim Wade, Tony Ta, Vít Ondruch, Yule, charlierudolph, machty, raymond sanchez, takiy33
rspec-core
- 总提交次数: 323
- 合并的拉取请求: 65
- 19 位贡献者:Alex Kwiatkowski, Ben Axnick, Benjamin Fleischer, Denis Laliberté, Eugene Kenny, Fabien Schurter, Fabio Napoleoni, Jon Rowe, Josh Cheek, Leo Arnold, Mark Swinson, Melissa Xie, Myron Marston, Raymond Sanchez, Ryan Ong, Samuel Esposito, Yule, raymond sanchez, takiy33
rspec-expectations
- 总提交次数: 148
- 合并的拉取请求: 40
- 12 位贡献者:Andrey Botalov, ChrisArcand, Fabien Schurter, Gavin Miller, Jared Beck, Jon Rowe, Myron Marston, Ryan Mulligan, Tim Wade, charlierudolph, machty, takiy33
rspec-mocks
- 总提交次数: 132
- 合并的拉取请求: 39
- 13 位贡献者:Bradley Schaefer, Fabien Schurter, John Ceh, Jon Rowe, Mauricio Linhares, Myron Marston, Nicholas Henry, Pavel Shpak, Sam Phippen, Samnang Chhun, Siva Gollapalli, Tim Wade, takiy33
rspec-rails
- 总提交次数: 83
- 合并的拉取请求: 24
- 15 位贡献者:Aaron Kromer, Anton Davydov, David Daniell, Gabe Martin-Dempesy, Igor Zubkov, Jean van der Walt, Joe Grossberg, Johannes Gorset, Jon Rowe, Lucas Mazza, Myron Marston, Orien Madgwick, Tony Ta, Vít Ondruch, takiy33
rspec-support
- 总提交次数: 83
- 合并的拉取请求: 32
- 8 位贡献者:Benjamin Fleischer, Fabian Wiesel, Gavin Miller, Jon Rowe, Myron Marston, Nicholas Chmielewski, Siva Gollapalli, takiy33
文档
API 文档
Cucumber 特性
发行说明
rspec-core-3.3.0
增强功能
- 通过
RSpec::Core::Example#reporter
公开用于运行示例的报告器。(Jon Rowe, #1866) - 使
RSpec::Core::Reporter#message
成为公开的受支持 API。(Jon Rowe, #1866) - 允许通过
RSpec::Core::Reporter#publish(event_name, hash_of_attributes)
发布自定义格式化程序事件。(Jon Rowe, #1869) - 删除对标准库
Set
的依赖,并将其替换为RSpec::Core::Set
。(Jon Rowe, #1870) - 为每个示例和组分配一个唯一的 ID,以便可以唯一地识别它们,即使对于共享示例(以及类似情况)来说,其位置也不唯一。(Myron Marston, #1884)
- 在位置不唯一的情况下,将示例 ID 用于为失败的示例打印的重新运行命令。(Myron Marston, #1884)
- 添加
config.example_status_persistence_file_path
选项,该选项用于持久化每个示例的上次运行状态。(Myron Marston, #1888) - 将
:last_run_status
元数据添加到每个示例中,该元数据指示示例上次运行时发生了什么。(Myron Marston, #1888) - 添加
--only-failures
CLI 选项,该选项仅过滤上次运行时失败的示例。(Myron Marston, #1888) - 添加
--next-failure
CLI 选项,该选项允许您反复关注当前失败的示例中的一个,然后移至下一个失败的示例,等等。(Myron Marston, #1888) - 使
--order random
排序稳定,以便当您使用给定的种子重新运行子集时,示例的顺序相对于彼此始终如一。(Myron Marston, #1908) - 更早地设置示例组常量,以便在评估上下文的过程中发生的错误包含示例组名称(Myron Marson, #1911)
- 使
let
和subject
线程安全。(Josh Cheek, #1858) - 在 JSON 格式化程序中添加版本信息。(Mark Swinson, #1883)
- 添加
--bisect
CLI 选项,该选项将反复运行您的套件,以将故障隔离到最小的可重现案例。(Myron Marston, #1917) - 对于
config.include
、config.extend
和config.prepend
,将模块应用于之前定义的匹配示例组。(Eugene Kenny, #1935) - 当解析无效选项时,通知用户这些选项来自哪里(例如
.rspec
或~/.rspec
或ENV['SPEC_OPTS']
),以便他们可以轻松找到问题的根源。(Myron Marston, #1940) - 将挂起消息内容添加到 json 格式化程序输出中。(Jon Rowe, #1949)
- 将共享组回溯添加到内置格式化程序为已修复的挂起示例显示的输出中。(Myron Marston, #1946)
- 添加对
:aggregate_failures
元数据的支持。使用此元数据标记示例或组,它将使用 rspec-expectations 的aggregate_failures
功能,允许示例中的多个失败并列出所有失败,而不是在第一个失败时中止。(Myron Marston, #1946) - 当没有格式化程序实现 #message 时,添加一个回退以防止这些消息丢失。(Jon Rowe, #1980)
- 分析示例现在考虑了
before(:context)
挂钩中花费的时间。(Denis Laliberté, Jon Rowe, #1971) - 改进示例在具有多个异常(例如,一个来自
it
块,一个来自after
块)时的失败输出。(Myron Marston, #1985)
错误修复
- 处理异常方法中的无效 UTF-8 字符串。(Benjamin Fleischer, #1760)
- 修复包含引号的文件名的 Rake 任务引用,使其在 Windows 上正常工作。(Myron Marston, #1887)
- 修复
RSpec::Core::RakeTask#failure_message
,使其在任务失败时打印。(Myron Marston, #1905) - 使
let
在通过元数据应用于单个示例的共享上下文中正常工作。(Myron Marston, #1912) - 确保
rspec/autorun
遵守配置默认值。(Jon Rowe, #1933) - 防止模块在示例组定义方法之后通过配置包含、追加或扩展时,覆盖示例组定义的方法。(Eugene Kenny, #1935)
- 修复导致共享示例在将规范过滤到特定位置时错误运行的回归。(Ben Axnick, #1963)
- 修复时间格式化逻辑,使其将 70 秒显示为“1 分钟 10 秒”,而不是“1 分钟 1 秒”。(Paul Brennan, #1984)
- 修复格式化程序加载程序允许重复格式化程序的回归。(Jon Rowe, #1990)
rspec-expectations-3.3.0
增强功能
- 公开
RSpec::Matchers::EnglishPhrasing
,以便更轻松地在自定义匹配器中编写良好的失败消息。(Jared Beck, #736) - 添加
RSpec::Matchers::FailMatchers
,它是一个混合模块,提供fail
、fail_with
和fail_including
匹配器,供扩展/插件作者用于指定预期失败。(Charlie Rudolph, #729) - 避免加载
tempfile
(及其依赖项),除非绝对需要。(Myron Marston, #735) - 改进尝试使用
be_true
或be_false
时的失败输出。(Tim Wade, #744) - 定义
RSpec::Matchers#respond_to_missing?
,以便RSpec::Matchers#respond_to?
和RSpec::Matchers#method
处理动态谓词匹配器。(Andrei Botalov, #751) - 对所有匹配器使用自定义 Time/DateTime/BigDecimal 格式化,以便它们在失败消息中始终如一地表示。(Gavin Miller, #740)
- 添加配置以关闭有关可能导致假阳性的匹配器组合的警告。(Jon Rowe, #768)
- 在使用可能会导致假阳性的裸
raise_error
匹配器时发出警告。(Jon Rowe, #768) - 在使用可能会导致假阳性的否定预期中的
raise_error
匹配器时发出警告,而不是引发异常。(Jon Rowe, #775) - 改进
include(a, b, c)
的失败消息,以便如果包含a
和b
,则失败消息只提及c
。(Chris Arcand, #780) - 允许
satisfy
匹配器接受一个可选的描述参数,该参数将用于description
、failure_message
和failure_message_when_negated
,以代替没有描述性的“满足块”。(Chris Arcand, #783) - 添加新的
aggregate_failures
API,允许多个独立的预期全部失败并在失败输出中列出,而不是在第一个失败时中止示例。(Myron Marston, #776) - 改进
raise_error
匹配器,使其可以接受匹配器作为单个参数,该参数匹配消息。(Time Wade, #782)
错误修复
- 使
contain_exactly
/match_array
与具有未定义<=>
的严格测试双重一起使用。(Myron Marston, #758) - 修复
include
匹配器,使其在将要混淆地突出显示实际包含但在逐行差异中不完全匹配的项目时,省略差异。(Tim Wade, #763) - 修复
match
匹配器,使其在将字符串或正则表达式与另一个匹配器(而不是字符串或正则表达式)匹配时不会崩溃。(Myron Marston, #772) - 静默仅包含空格的差异。(Myron Marston, #801)
rspec-mocks-3.3.0
增强功能
- 当在
MyClass
或class_double(MyClass)
上存根new
时,使用MyClass#initialize
中的方法签名来验证参数。(Myron Marston, #886) - 在生成模拟预期失败的接收参数的描述时,使用匹配器描述。(Tim Wade, #891)
- 避免不必要地加载
stringio
。(Myron Marston, #894) - 验证双重失败消息现在区分类级方法和实例级方法。(Tim Wade, #896, #908)
- 改进模拟预期失败消息,以便将接收次数和接收到的参数都合并到输出中。(John Ceh, #918)
- 改进测试双重在失败消息中的表示方式。(Siva Gollapalli, Myron Marston, #932)
- 将
RSpec::Mocks::Configuration#when_declaring_verifying_double
重命名为RSpec::Mocks::Configuration#before_verifying_doubles
,并在验证部分双重时使用它。(Jon Rowe, #940) - 使用 rspec-support 的
ObjectFormatter
改进失败消息中参数的格式,以便例如,对时间对象显示完整的时间精度。(Gavin Miller, Myron Marston, #955)
错误修复
- 确保在 RSpec 验证期间,主动引发的预期也会引发异常。这意味着如果在测试执行期间捕获异常,测试仍然会失败。(Sam Phippen, #884)
- 修复
have_received(msg).with(args).exactly(n).times
和receive(msg).with(args).exactly(n).times
失败消息,用于消息使用指定的参数接收错误的次数,并且还使用其他参数接收了其他次数。以前它会令人困惑地将参数列为不匹配(即使允许双重使用任何参数接收),而不是列出计数。(John Ceh, #918) - 修复
any_args
/anything
支持,以便我们避免在可能已不正确地实现了==
以引发错误的用户对象上调用obj == anything
。(Myron Marston, #924) - 修复涉及在类和子类上存根相同方法的边缘情况,该边缘情况以前在 RSpec 中内部遇到了
NoMethodError
。(Myron Marston #954) - 修复边缘情况,其中接收到的消息计数会因一次失败而增加多次。(Myron Marston, #957)
- 修复当间谍使用不同的参数接收预期消息并且还接收了其他消息时的失败消息。(Maurício Linhares, #960)
- 静默仅包含空格的差异。(Myron Marston, #969)
rspec-rails-3.3.0
增强功能
- 添加对通过脚手架创建的路由规范中的 PATCH 的支持。(Igor Zubkov, #1336)
- 通过使用
yield
而不是call
,改进控制器和路由规范对routes
的调用。(Anton Davydov, #1308) - 添加对
ActiveJob
规范作为标准RSpec::Rails::RailsExampleGoup
的支持,通过:type => :job
和从规范目录spec/jobs
推断类型。(Gabe Martin-Dempesy, #1361) - 将
RSpec::Rails::FixtureSupport
包含到使用元数据:use_fixtures => true
的示例组中。(Aaron Kromer, #1372) - 包含
rspec:request
生成器来生成请求规格;这是rspec:integration
的别名(Aaron Kromer,#1378) - 使用默认检查更新
rails_helper
生成器,当 Rails 环境为生产环境时,中止规格运行。(Aaron Kromer,#1383)
rspec-support-3.3.0
增强功能
- 改进失败消息中数组和哈希的格式,使其使用我们自定义的匹配器、时间对象等的格式。(Myron Marston,Nicholas Chmielewski,#205)
- 也使用改进的格式进行差异比较。(Nicholas Chmielewski,#205)
错误修复
- 修复
FuzzyMatcher
,使其检查expected == actual
而不是actual == expected
,这避免了在actual
对象的==
错误地实现为假设只提供相同类型的对象的情况下的错误。这允许 rspec-mocks 的anything
匹配带有错误==
定义的对象。(Myron Marston,#193)