RSpec 3.2 已发布!
Myron Marston
2015 年 2 月 3 日RSpec 3.2 刚刚发布!鉴于我们对 语义化版本控制 的承诺,对于已经使用 RSpec 3.0 或 3.1 的任何人来说,这应该是一个微不足道的升级,但如果我们引入了任何回归,请告诉我们,我们将尽快发布一个修复补丁版本。
RSpec 仍然是一个社区驱动的项目,来自世界各地的贡献者参与其中。此版本包含来自 50 多位不同贡献者的 915 次提交和 278 个合并的拉取请求!
感谢所有帮助实现此版本的人!
值得注意的更改
Windows CI
RSpec 一直支持 Windows,但所有核心维护人员都在 POSIX 系统上开发的事实偶尔会使这变得困难。当 RSpec 3.1 发布时,我们不幸地破坏了 Windows 上的几件事,直到一些用户报告了这些问题(后来在 3.1.x 补丁版本中修复)我们才得知。我们希望防止这种情况再次发生,因此这次我们努力让 Windows CI 构建在 AppVeyor 上运行。
我们的 Windows 构建已经通过,但这里还有更多工作要做。如果您是 RSpec 和 Windows 用户,并且想帮助我们,请联系我们!
核心:待定示例输出包含失败细节
RSpec 3.0 附带了 pending
的新语义。与其跳过示例(现在可以使用 skip
来实现),待定示例会执行,并期望出现失败,如果沒有失败,它们会失败以通知您,这些示例不再需要标记为 pending
。这种更改非常有用,因为它确保每个 pending
示例都需要是待定的。但是,格式化程序输出并没有指示导致示例保持待定的失败,因此您必须取消待定示例才能看到该详细信息。
在 RSpec 3.2 中,我们纠正了这一点:pending
示例输出现在包含执行示例时发生的失败。
核心:每个示例现在都有一个单例组
RSpec 有许多基于元数据的特性,到目前为止,这些特性只适用于示例组,而不适用于单个示例。
RSpec.configure do |config|
# 1. Filtered module inclusion: examples in groups tagged with `:uses_time`
# will have access to the instance methods of `TimeHelpers`
config.include TimeHelpers, :uses_time
# 2. Context hooks: a browser will start before groups tagged
# with `:uses_browser` and shutdown afterwards.
config.before(:context, :uses_browser) { Browser.start }
config.after( :context, :uses_browser) { Browser.shutdown }
end
# 3. Shared context auto-inclusion: groups tagged with
# `:uses_redis` will have this context included.
RSpec.shared_context "Uses Redis", :uses_redis do
let(:redis) { Redis.connect(ENV['REDIS_URL']) }
before { redis.flushdb }
end
在每种情况下,用适当元数据标记的单个示例都不会应用这些构造,这很容易忘记。这在 RSpec 3.2 中正在改变:我们现在将每个示例视为隐式地属于仅包含一个示例的单例示例组的一部分,这使我们能够将这些构造应用于单个示例,而不仅仅是组。如果您熟悉 Ruby 的对象模型,这可能听起来很熟悉——Ruby 中的每个对象都有一个单例类,它包含只适用于该实例的自定义行为。此特性是在 Ruby 的单例类之上简单实现的。
核心:性能改进
我们在优化 RSpec 3.2 的 rspec-core 性能方面投入了大量精力。除了某些算法更改和许多微优化之外,我们还找到了大幅减少 rspec-core 完成的对象分配数量的方法。根据我的 基准测试,RSpec 3.2 分配的对象比 RSpec 3.1 少约 30%,同时获得了许多新特性。
在未来的版本中,我希望我们能将类似的改进应用于 rspec-expectations 和 rspec-mocks。
核心:新的沙箱 API
RSpec 使用 RSpec 进行测试。在 rspec-core 中,我们规范套件中的许多规范定义并运行示例组和示例,以验证当在真实的 RSpec 上下文中运行时,RSpec 的各种构造如何关联的行为。为了促进这种自食其力的行为,rspec-core 的规范套件长期以来一直使用沙箱技术。每个规范都可以自由地改变配置并定义示例组和示例,而无需担心这会如何干扰 RSpec 运行程序的内部状态。
这种沙箱显然对 RSpec 自己的内部使用很有用,但它也对测试第三方 RSpec 扩展很有用。我们现在将其作为新的公共 API 提供。
# You have to require this file to make this API available...
require 'rspec/core/sandbox'
RSpec.configure do |config|
config.around do |ex|
RSpec::Core::Sandbox.sandboxed(&ex)
end
end
感谢 Tyler Ball 实现了这一点。
核心:共享示例组改进
在此版本中,我们修复了与共享示例组相关的几个长期存在的错误和 annoyances。
- 在共享组中定义的示例的失败现在包含完整的共享示例组包含回溯,以便您可以查明包含失败的确切包含。 #1763
- 共享示例组失败的重新运行命令现在应该始终有效地重新运行失败的示例(尽管它可能也会运行其他示例)。 #1835
- 应用于共享示例的位置筛选现在可以正常工作,用于一些奇怪的边缘情况,这些情况在之前失败。 #1837
如果您过去遇到过由于这些问题导致的共享示例组问题,您可能想再次尝试一下。
期望:用于 DSL 定义的自定义匹配器的链式简写
自定义匹配器 DSL 具有 chain
方法,该方法使向您的匹配器添加流畅接口变得容易。
RSpec::Matchers.define :be_bigger_than do |min|
chain :but_smaller_than do |max|
@max = max
end
match do |value|
value > min && value < @max
end
end
# usage:
expect(10).to be_bigger_than(5).but_smaller_than(15)
如本例所示,chain
的最常见用法是接受一个额外的参数,该参数在 match
逻辑中以某种方式使用。Tom Stuart 建议并实现 了一个改进,允许您将匹配器定义缩短为
RSpec::Matchers.define :be_bigger_than do |min|
chain :but_smaller_than, :max
match do |value|
value > min && value < max
end
end
chain
的第二个参数——:max
——用于定义一个 max
属性,该属性设置为传递给 but_smaller_than
的参数。
感谢,Tom Stuart!
期望:输出匹配器可以处理子进程
RSpec 3.0 附带了一个新的 output
匹配器,允许您指定预期输出到 stdout
或 stderr
expect { print 'foo' }.to output('foo').to_stdout
expect { warn 'foo' }.to output(/foo/).to_stderr
用于这些匹配器的机制——暂时用 StringIO
替换 $stdout
或 $stderr
,持续时间为块——非常简单,但当您生成将输出到这些流之一的子进程时,它不起作用。例如,这会失败
expect { system('echo foo') }.to output("foo\n").to_stdout
在 RSpec 3.2 中,您可以用 to_stdout_from_any_process
替换 to_stdout
,并且此期望将起作用。
expect { system('echo foo') }.to output("foo\n").to_stdout_from_any_process
这使用了一种备用机制,其中 $stdout
暂时重新打开到临时文件,该机制可以与子进程一起使用。不幸的是,它也慢得多——在我们的 基准测试 中,它慢了 30 倍!因此,您必须使用 to_std(out|err)_from_any_process
而不是 to_std(out|err)
来选择它。
感谢 Alex Genco 实现了 此改进!
期望:DSL 定义的自定义匹配器现在可以接收块
当使用 DSL 定义自定义匹配器时,在某些情况下,接收块会很不错
RSpec::Matchers.define :be_sorted_by do |&blk|
match do |array|
array.each_cons(2).all? do |a, b|
(blk.call(a) <=> blk.call(b)) <= 0
end
end
end
# intended usage:
expect(users).to be_sorted_by(&:email)
不幸的是,Ruby 的限制不允许我们支持这一点。define
块使用 class_exec
执行,这确保它在新的匹配器类的上下文中评估,同时还允许我们将来自调用站点的参数转发到 define
块。传递给 class_exec
的块是要评估的块(在本例中,是 define
块),并且无法将两个块传递给 class_exec
。
在 RSpec 的早期版本中,传递给 be_sorted_by
的块会被静默忽略。在 RSpec 3.2 中,我们现在会发出一个警告
WARNING: Your `be_sorted_by` custom matcher receives a block argument (`blk`), but
due to limitations in ruby, RSpec cannot provide the block. Instead, use the
`block_arg` method to access the block. Called from path/to/file.rb:line_number.
…它告诉您另一种实现此目的的方法:新的 block_arg
方法,可以在自定义匹配器中使用。
RSpec::Matchers.define :be_sorted_by do
match do |array|
array.each_cons(2).all? do |a, b|
(block_arg.call(a) <=> block_arg.call(b)) <= 0
end
end
end
感谢 Mike Dalton 实现了 此改进。
模拟:any_args
作为参数 splat 运作
RSpec 很久以前就有了 any_args
匹配器
expect(test_double).to receive(:message).with(any_args)
any_args
匹配器与它的字面意思完全相同:它允许任何参数(包括无参数)与消息期望匹配。在 RSpec 3.1 及之前的版本中,any_args
只能用作 with
的独立参数。在 RSpec 3.2 中,我们将其视为参数 splat,因此您现在可以在参数列表中的任何位置使用它
expect(test_double).to receive(:message).with(1, 2, any_args)
这将匹配诸如 test_double.message(1, 2)
或 test_double.message(1, 2, 3, 4)
之类的调用。
模拟:不匹配的参数现在会被 diff
使 RSpec 的失败输出如此有用的一个重要部分是您从特定匹配器获得的失败的 diff。但是,消息期望失败从未包含 diff。例如,考虑这个失败的消息期望
test_double = double
expect(test_double).to receive(:foo).with(%w[ 1 2 3 4 ].join("\n"))
test_double.foo(%w[ 1 2 5 4 ].join("\n"))
在 RSpec 3.1 及之前的版本中,这会失败,并显示
Failure/Error: test_double.foo(%w[ 1 2 5 4 ].join("\n"))
Double received :foo with unexpected arguments
expected: ("1\n2\n3\n4")
got: ("1\n2\n5\n4")
RSpec 3.2 现在在适当的时候(通常是在多行字符串中或当对象的漂亮打印输出是多行时)在消息期望失败中包含 diff。在 3.2 中,这会失败,并显示
Failure/Error: test_double.foo(%w[ 1 2 5 4 ].join("\n"))
Double received :foo with unexpected arguments
expected: ("1\n2\n3\n4")
got: ("1\n2\n5\n4")
Diff:
@@ -1,5 +1,5 @@
1
2
-3
+5
4
感谢 Pete Higgins 最初建议 此特性,并 从 rspec-expectation 中提取我们的 differ 到 rspec-support,并感谢 Sam Phippen 更新 rspec-mocks 以使用新提供的 differ。
模拟:验证双重可以被命名
RSpec 的 double
一直支持可选名称,该名称在消息期望失败中使用。在 RSpec 3.0 中,我们添加了一些新的测试双重类型——instance_double
、class_double
和 object_double
——在 3.1 中,我们添加了 instance_spy
、class_spy
和 object_spy
…但我们忘记了为这些类型支持可选名称。在 RSpec 3.2 中,这些双重类型现在支持可选名称。只需传递第二个参数(在接口参数之后,但在任何存根之前)
book_1 = instance_double(Book, "The Brothers Karamozov", author: "Fyodor Dostoyevsky")
book_2 = instance_double(Book, "Lord of the Rings", author: "J.R.R. Tolkien")
感谢 Cezary Baginski 实现了 此功能。
Rails:实例双重支持由 ActiveRecord 定义的动态列方法
ActiveRecord 基于底层表的列模式,在您的模型类上定义了许多方法。当您第一次调用这些方法中的一个时,就会动态地发生这种情况。不幸的是,这导致在使用基于 ActiveRecord 的 instance_double
时出现令人困惑的行为:由于 User.method_defined?(:email)
在第一次调用列方法之前返回 false
,因此 instance_double(User)
最初不允许 email
被存根,直到列方法被动态定义。
我们 记录了此问题,但它仍然是用户经常感到困惑的来源。在 RSpec 3.2 中,我们已经解决了这个问题——我们现在强制模型在创建基于 ActiveRecord 的 instance_double
时定义列方法,以便验证后的双重按预期工作。
感谢 Jon Rowe 实现了 此改进!
Rails:支持 Ruby 2.2 与 Rails 3.2 和 4.x
Ruby 2.2 于 12 月发布,虽然大多数 Ruby 2.1 代码库在 2.2 上运行良好,但 Rails 核心团队不得不对 Rails 进行一些更改以支持 2.2。同样,Aaron Kromer 已经更新了 rspec-rails 以在 Rails 3.2 和 Rails 4.x 上支持 Ruby 2.2。
Rails:ActionMailer 预览的新生成器
ActionMailer 预览是 Rails 4.1 中的 新功能 之一。默认情况下,Rails 在您的 test
目录中生成预览类。由于 RSpec 项目使用 spec
而不是 test
,因此这与 rspec-rails 并不很好地集成。
在 3.2 中,rspec-rails 现在附带了一个生成器,它会将 ActionMailer 预览类放在您的 spec
目录中,提供与 Rails 已经为 Test::Unit 和 Minitest 用户提供的相同功能。
感谢 Takashi Nakagawa 提供了 初始实现,并感谢 Aaron Kromer 对其进行了 进一步改进。
统计
合并
- 总提交次数: 915
- 合并的拉取请求: 278
- 54 位贡献者: Aaron Kromer, Akos Vandra, Alex Chaffee, Alex Genco, Alexey Fedorov, Andy Waite, Arlandis Lawrence, Avner Cohen, Ben Moss, Ben Snape, Benjamin Fleischer, Brian Kane, Cezary Baginski, ChaYoung You, Christian Nelson, Dennis Ideler, Durran Jordan, Elena Sharma, Elia Schito, Eliot Sykes, Fumiaki MATSUSHIMA, Griffin Smith, Guido Günther, Jim Kingdon, Jon Rowe, Jonathan, Jonathan Rochkind, Jori Hardman, Kevin Mook, Max Lincoln, Melanie Gilman, Michael Stock, Mike Dalton, Myron Marston, Peter Rhoades, Piotr Jakubowski, Postmodern, Rebecca Skinner, Ryan Fitzgerald, Sam Phippen, Scott Archer, Siva Gollapalli, Takashi Nakagawa, Thaddee Tyl, Thales Oliveira, Tim Wade, Tom Schady, Tom Stuart, Tony Novak, Xavier Shay, Yorick Peterse, Yuji Nakayama, dB, tyler-ball
rspec-core
- 总提交次数: 364
- 合并的拉取请求: 89
- 23 位贡献者: Aaron Kromer, Akos Vandra, Alex Chaffee, Alexey Fedorov, Arlandis Lawrence, Ben Moss, Ben Snape, Cezary Baginski, ChaYoung You, Christian Nelson, Durran Jordan, Fumiaki MATSUSHIMA, Guido Günther, Jim Kingdon, Jon Rowe, Jonathan Rochkind, Kevin Mook, Max Lincoln, Mike Dalton, Myron Marston, Sam Phippen, Tom Schady, tyler-ball
rspec-expectations
- 总提交次数: 123
- 合并的拉取请求: 45
- 14 位贡献者: Aaron Kromer, Alex Genco, Alexey Fedorov, Avner Cohen, Ben Moss, Elia Schito, Jon Rowe, Jonathan, Jori Hardman, Mike Dalton, Myron Marston, Postmodern, Siva Gollapalli, Tom Stuart
rspec-mocks
- 总提交次数: 180
- 合并的拉取请求: 61
- 17 位贡献者: Aaron Kromer, Andy Waite, Ben Moss, Cezary Baginski, Jon Rowe, Melanie Gilman, Myron Marston, Piotr Jakubowski, Ryan Fitzgerald, Sam Phippen, Siva Gollapalli, Tim Wade, Tom Schady, Tony Novak, Xavier Shay, Yorick Peterse, dB
rspec-rails
- 总提交次数: 136
- 合并的拉取请求: 42
- 17 位贡献者: Aaron Kromer, Ben Moss, Brian Kane, Dennis Ideler, Elena Sharma, Eliot Sykes, Griffin Smith, Jon Rowe, Michael Stock, Myron Marston, Peter Rhoades, Rebecca Skinner, Sam Phippen, Takashi Nakagawa, Thaddee Tyl, Thales Oliveira, Yuji Nakayama
rspec-support
- 总提交次数: 112
- 合并的拉取请求: 41
- 10 位贡献者: Aaron Kromer, Alex Genco, Alexey Fedorov, Ben Moss, Benjamin Fleischer, Jon Rowe, Myron Marston, Sam Phippen, Scott Archer, Yorick Peterse
文档
API 文档
Cucumber 功能
发布说明
rspec-core-3.2.0
增强功能
- 改进示例组的
inspect
输出。 (Mike Dalton, #1687) - 当 Rake 任务失败时,仅在设置了
verbose
标志时才输出命令。 (Ben Snape, #1704) - 添加
RSpec.clear_examples
作为在两次规范运行之间重置示例的清晰方法,同时保留用户配置。 (Alexey Fedorov, #1706) - 分别将定义和运行示例时的字符串分配减少 70% 和 50%。 (Myron Marston, #1738)
- 从标准库中删除对 pathname 的依赖。 (Sam Phippen, #1703)
- 改进用户按下 Ctrl-C 时显示的消息。 (Alex Chaffee #1717, #1742)
- 改进在失败的示例输出中显示的共享示例组包含回溯,使其适用于所有包含共享示例组的方法,并显示所有包含位置。 (Myron Marston, #1763)
- 在报告器运行的开始(以及结束)发出种子通知。 (Arlandis Word, #1761)
- 改进围绕钩子的文档。 (Jim Kingdon, #1772)
- 支持从配置中将模块预先添加到示例组中,并允许根据元数据进行过滤。 (Arlandis Word, #1806)
- 在示例组上注册
:suite
钩子时发出警告(一直以来都已忽略)或使用元数据进行注册(一直以来都已忽略)。 (Myron Marston, #1805) - 当用户在示例中调用 RSpec 示例组 API(例如
context
、describe
、it
、let
、before
等)时,这些 API 不可使用,提供友好的错误消息。 (Myron Marston, #1819) - 当用户在示例组中调用 RSpec 示例 API(例如
expect
、double
、stub_const
等)时,这些 API 不可使用,提供友好的错误消息。 (Myron Marston, #1819) - 添加新的
RSpec::Core::Sandbox.sandboxed { }
API,该 API 便于使用 RSpec 测试 RSpec,允许您在示例中定义示例组和示例,而不会影响全局RSpec.world
状态。 (Tyler Ball, 1808) - 仅将行号过滤器应用于它们所作用的文件,允许您混合使用已过滤和未过滤的文件。 (Myron Marston, #1839)
- 在转储待处理示例时,包含失败详细信息,这样您就不必取消挂起示例以查看它。 (Myron Marston, #1844)
- 使
-I
选项在用File::PATH_SEPARATOR
分隔时支持多个值,例如rspec -I foo:bar
。 这与 Ruby 的-I
选项的行为一致。 (Fumiaki Matsushima, #1855)。
错误修复
- 在分配生成的示例描述时,在示例描述中显示
matcher.description
引发的错误。 (Myron Marston, #1771) - 在生成示例描述时,不要考虑
after
钩子中的预期。 (Myron Marston, #1771) - 当具有匹配元数据的组中的示例覆盖父元数据值使其不匹配时,不要将元数据过滤的配置钩子应用于这些示例。 (Myron Marston, #1796)
- 修复
config.expect_with :minitest
,以便skip
使用 RSpec 的实现而不是 Minitest 的实现。 (Jonathan Rochkind, #1822) - 修复在定义重复的示例组别名且 DSL 未全局公开时导致的
NameError
。 (Aaron Kromer, #1825) - 当在外部文件中定义的共享示例失败时,使用主机示例组(来自加载的规范文件)来获取重新运行命令,以确保命令能够正常工作。 (Myron Marston, #1835)
- 修复位置过滤,使其在外部文件中定义的共享示例组中定义的嵌套示例组中正常工作。 (Bradley Schaefer, Xavier Shay, Myron Marston, #1837)
- 当待处理示例因模拟预期而按预期失败时,设置
RSpec::Core::Example::ExecutionResult#pending_exception
- 以前它没有被设置,但应该被设置。 (Myron Marston, #1844) - 修复 Rake 任务,使其在
rspec-core
安装在包含空格的目录中时也能正常工作。 (Guido Günther, #1845) - 修复 3.1 中导致
describe Regexp
抛出错误的回归问题。 (Durran Jordan, #1853) - 修复 3.x 中导致概要信息在摘要之后打印的回归问题。 (Max Lincoln, #1857)
- 在加载
--require
文件之前应用--seed
,以便所需文件可以访问提供的种子。 (Myron Marston, #1745) - 处理
RSpec::Core::Formatters::DeprecationFormatter::FileStream
被重新打开并使用 IO 流的情况,这种情况有时会发生在 spring 中。 (Kevin Mook, #1757)
rspec-expectations-3.2.0
增强功能
- 在自定义匹配器 API 中添加
block_arg
方法,该方法允许您访问传递给自定义匹配器的块(如果有)。 (Mike Dalton, #645) - 在
yield_control
匹配器的失败消息中提供更多详细信息。 (Jon Rowe, #650) - 在匹配器 DSL 中添加
chain
的简写语法,该语法为其他地方使用分配值,例如chain :and_smaller_than, :small_value
为small_value
创建一个attr_reader
(Tom Stuart, #644) - 在使用
should
语法时提供更有帮助的弃用消息。 (Elia Schito, #663) - 在
have_attributes
匹配器失败消息中提供更多详细信息。 (Jon Rowe, #668) - 使
have_attributes
匹配器可比较差异。 (Jon Rowe, Alexey Fedorov, #668) - 添加
output(...).to_std(out|err)_from_any_process
作为output(...).to_std(out|err)
的替代方案。 后者在子进程写入命名流时不起作用,但速度更快。 (Alex Genco, #700) - 改进组合匹配器(由
and
和or
创建),以便当一个或多个匹配器可比较差异时,差异包含在失败中。 (Alexey Fedorov, #713)
错误修复
- 避免在目标对象上对
be
谓词匹配器调用private_methods
,如果对象公开响应谓词方法。 这避免了在对象从private_methods
抛出错误时可能发生的错误(这可能发生在 celluloid 对象中)。 (@chapmajs, #670) - 使
yield_control
(无修饰符)默认使用at_least(:once)
,而不是在遇到多个产量时抛出令人困惑的错误。 (Myron Marston, #675) - 修复在 rspec-core 上下文之外使用 rspec-expectations 时出现的“实例变量 @color 未初始化”警告。 (Myron Marston, #689)
- 修复
start_with
和end_with
,使其在将字符串与字符串数组进行比较时能正常工作。 (Myron Marston, #690) - 在为没有文档字符串的示例生成描述时,不要使用内部委托的匹配器。 (Myron Marston, #692)
rspec-mocks-3.2.0
增强功能
- 将
any_args
视为参数散列,使其能够在参数列表中的任何位置匹配任意数量的参数。 (Myron Marston, #786) - 当模拟预期中的参数不匹配时,打印差异。 (Sam Phippen, #751)
- 支持已验证的双重的名称 (
instance_double
、instance_spy
、class_double
、class_spy
、object_double
、object_spy
)。 (Cezary Baginski, #826) - 使
array_including
和hash_including
参数匹配器可组合。 (Sam Phippen, #819) - 使
allow_any_instance_of(...).to receive(...).and_wrap_original
正常工作。 (Ryan Fitzgerald, #869)
错误修复
- 当用户错误地将
no_args
与其他参数结合使用时(例如expect().to receive().with(no_args, 1)
),提供清晰的错误。 (Myron Marston, #786) - 当用户错误地在同一个参数列表中多次使用
any_args
时(例如expect().to receive().with(any_args, 1, any_args)
),提供清晰的错误。 (Myron Marston, #786) - 阻止错误生成器使用用户对象 #description 方法。 请参阅 #685。 (Sam Phippen, #751)
- 使声明为
(instance|class)_double(SomeConst)
的已验证的双重在SomeConst
之前已被存根时能正常工作。(instance|class)_double("SomeClass")
已经能正常工作。 (Myron Marston, #824) - 为
receive
、receive_messages
和receive_message_chain
添加匹配器描述。 (Myron Marston, #828) - 验证空对象已验证的双重的调用参数。 (Myron Marston, #829)
- 修复当使用无效常量调用
RSpec::Mocks::Constant.original
时,它会返回一个表示常量名称无效的对象,而不是崩溃。 (Myron Marston, #833) - 使任何对象上的
extend RSpec::Mocks::ExampleMethods
正常工作,以将 rspec-mocks API 添加到该对象。 以前,expect
将是未定义的。 (Myron Marston, #846) - 修复
require 'rspec/mocks/standalone'
,使其仅影响main
而不是所有对象。 它实际上只打算在 IRB 这样的 REPL 中使用,但一些 gem 加载了它,认为在 rspec-core 上下文之外使用 rspec-mocks 时需要加载它。 (Myron Marston, #846) - 阻止消息预期在调用后被自定义方法(例如
with
)修改。 (Sam Phippen 和 Melanie Gilman, #837) - 处理无法删除方法存根的情况,因为 RSpec 之外的东西修改了方法定义。 例如,当您在先前存根
file
对象上的方法之后,file.reopen(io)
时,就会发生这种情况。 (Myron Marston, #853) - 当接收到的消息参数在
have_received(...).with(...)
预期之前被修改时,提供清晰的错误。 (Myron Marston, #868)
rspec-rails-3.2.0
增强功能
- 包含
ActionMailer
邮件预览的生成器 (Takashi Nakagawa, #1185) - 通过 Railtie 配置
ActionMailer
预览路径 (Aaron Kromer, #1236) - 在运行
rails generate
时显示所有 RSpec 生成器 (Eliot Sykes, #1248) - 在 Rails 3.2 和 4.x 中支持 Ruby 2.2 (Aaron Kromer, #1264, #1277)
- 改进
instance_double
以支持验证由ActiveRecord
定义的动态列方法 (Jon Rowe, #1238) - 镜像在 Rails 4 上的规范生成器中为
type
标记使用 Ruby 1.9 哈希语法的做法。 (Michael Stock, #1292)
错误修复
- 修复
rspec:feature
生成器以使用RSpec
命名空间,防止在禁用猴子补丁时出现错误。 (Rebecca Skinner, #1231) - 修复了当 Capybara 不可用或 Capybara 版本低于 2.4.0 时,调用
RSpec.feature
导致的NoMethodError
错误。(Aaron Kromer,#1261) - 修复了当使用继承外部组匿名控制器的匿名控制器时出现的
ArgumentError
错误。(Yuji Nakayama,#1260) - 修复了在 Rails 4.1 和 4.2 中使用自定义
Test
类时出现的“Test 不是类(TypeError)”错误。(Aaron Kromer,#1295)
rspec-support-3.2.0
增强功能
- 添加额外的 Ruby 类型检测。(Jon Rowe,#133)
- 使比较器实例可重复使用。(Alexey Fedorov,#160)
错误修复
- 在执行模糊匹配时,不再将
[]
和{}
视为匹配。(Myron Marston,#157)