RSpec 2.99 和 3.0 beta2 已经发布!
Myron Marston
2014 年 2 月 21 日RSpec 团队发布了 3.0.0.beta2 和 2.99.0.beta2。
这是一个巨大的版本,包含了大量的全新功能。我计划稍后发布一篇完整的博客文章,列出并给出所有 3.0 的新功能示例。现在,我只发布了完整的发布说明。
感谢所有帮助发布此版本的贡献者!
我也要感谢那些已经将项目进行升级并使用 3.0.0.beta1 的人,你们的反馈非常宝贵。
有关升级过程的更多详细信息,请参阅beta1 公告 博客文章。
这将是最后一个 2.99/3.0 beta 版本。接下来是候选版本!
发布说明
rspec-core 2.99.0.beta2
增强功能
- 为易于阅读的单行代码添加
is_expected
,使用expect
语法。is_expected
只是定义为expect(subject)
,可以在表达式中使用,例如:it { is_expected.to read_well }
。(Myron Marston) - 从 RSpec 3 反向移植
skip
,当没有提供代码块时,它就像 RSpec 2 中的pending
一样,因为pending
的行为在 RSpec 3 中正在改变。(Xavier Shay)
弃用
- 弃用不精确的
mock_with
配置选项。RSpec 3 仅支持精确符号:rspec
、:mocha
、:flexmock
、:rr
或:nothing
(或实现适配器接口的任何模块)。RSpec 2 执行了模糊匹配,但这在未来将不再受支持。(Myron Marston) - 弃用
show_failures_in_pending_blocks
配置选项。要实现与启用选项相同的行为,可以使用自定义格式化程序。(Xavier Shay) - 添加一个弃用警告,说明
pending
的行为在 RSpec 3 中正在改变 - 而不是跳过示例(如在 2.x 中没有提供代码块时),它将运行示例并在没有引发异常的情况下将其标记为失败。使用skip
代替以保留旧的行为。(Xavier Shay) - 弃用 ‘s’、‘n’、‘spec’ 和 ‘nested’ 作为文档格式化程序的别名。(Jon Rowe)
- 弃用
RSpec::Core::Reporter#abort
,支持RSpec::Core::Reporter#finish
。(Jon Rowe)
错误修复
- 修复运行结束摘要中的失败(未定义方法
path
),当配置了raise_errors_for_deprecations!
时。(Myron Marston) - 修复从命令行覆盖规格排序但未被内部完全识别的错误。(Jon Rowe)
rspec-core 3.0.0.beta2
3.0.0 的重大更改
- 使
mock_with
选项更加严格。字符串不再受支持(例如mock_with "mocha"
) - 使用符号代替。此外,无法识别的值现在将导致错误,而不是回退到空模拟适配器。如果你想使用空模拟适配器,请使用mock_with :nothing
(如长期文档所述)。(Myron Marston) - 删除对覆盖 RSpec 内置
:if
和:unless
过滤器的支持。(Ashish Dixit) - 现在需要自定义格式化程序调用
RSpec::Core::Formatters.register(formatter_class, *notifications)
,其中notifications
是格式化程序想要接收通知的事件列表。通知由与格式化程序上的名称匹配的方法处理。这使我们能够添加或删除通知,而不会破坏现有的格式化程序。(Jon Rowe) - 更改传递给格式化程序的参数。我们不再传递多个参数(这限制了我们添加其他参数的能力,因为这样做会破坏现有的格式化程序),而是传递一个通知值对象,该对象通过属性公开相同的数据。这将使我们能够在不破坏现有格式化程序的情况下,向通知事件添加新的数据位。(Jon Rowe)
- 删除对
RSpec.configuration.add_setting
的弃用:alias
选项的支持。(Myron Marston) - 删除对弃用
RSpec.configuration.requires = [...]
的支持。(Myron Marston) - 删除对弃用
--formatter
CLI 选项的支持。(Myron Marston) - 删除对弃用
--configure
CLI 选项的支持。(Myron Marston) - 删除对弃用
RSpec::Core::RakeTask#spec_opts=
的支持。(Myron Marston) - 示例组级别的
pending
代码块或:pending
元数据现在将执行示例,如果通过,则导致失败,否则如果失败,则将处于待定状态。旧的“从不运行”行为仍用于xexample
、xit
和xspecify
,或通过新的skip
方法或:skip
元数据选项。(Xavier Shay) - 在示例内部调用
pending
后,示例的其余部分现在将运行。如果通过,将引发失败,否则示例将被标记为待定。旧的“从不运行”行为通过新的skip
方法提供。(Xavier Shay) - 示例内部的待定代码块已作为一项功能删除,没有直接替代。使用
skip
或pending
而不使用代码块。(Xavier Shay) - 不再允许在
before(:all)
挂钩中使用待定语句。使用skip
代替。(Xavier Shay) - 删除
show_failures_in_pending_blocks
配置选项。(Xavier Shay) - 删除对使用 ‘s’、‘n’、‘spec’ 或 ‘nested’ 指定文档格式化程序的支持。(Jon Rowe)
增强功能
- 向 JSON 格式化程序输出添加示例运行时间。(Karthik Kastury)
- 向
rspec --init
生成的文件添加更多建议的设置。(Myron Marston) - 添加
config.alias_example_group_to
,它可以用于定义一个新的方法,该方法使用提供的元数据定义一个示例组。(Michi Huber) - 添加
xdescribe
和xcontext
作为快捷方式,使示例组处于待定状态。(Myron Marston) - 添加
fdescribe
和fcontext
作为快捷方式,以集中示例组。(Myron Marston) - 默认情况下,不要通过
#at_exit
自动运行规格。require 'rspec/autorun'
仅在通过ruby
运行规格时才需要,因为它一直都是这样。通过rake
或rspec
运行规格不受影响。(Ben Hoskings) - 添加
expose_dsl_globally
配置选项,默认为 true。禁用它将删除 rspec-core 添加到main
和Module
的猴子补丁(例如describe
、shared_examples_for
等)。(Jon Rowe) - 在
RSpec
常量上公开 RSpec DSL 入口点方法(describe
、shared_examples_for
等)。旨在在expose_dsl_globally
设置为false
时使用。(Jon Rowe) - 为了保持一致性,在
RSpec
常量上公开所有示例组别名(包括context
)。如果expose_dsl_globally
设置为true
,还在main
和Module
上公开它们。历史上,只有describe
被公开。(Jon Rowe, Michi Huber)
错误修复
- 修复运行结束摘要中的失败(未定义方法
path
),当配置了raise_errors_for_deprecations!
时。(Myron Marston) - 在尝试在命令行上使用 -i 或 –I 时,发出错误,因为它们与 -I 太接近,无法被视为 –init 的简写。(Jon Rowe)
- 如果已将相同的格式化程序添加到该输出,则阻止将格式化程序添加到输出目标。(Alex Peattie)
- 允许在示例处于待定状态时使用匹配器生成的示例描述。(Myron Marston)
- 确保配置的
failure_exit_code
在出现失败时被 rake 任务使用。(Jon Rowe) - 恢复系统排除过滤器优先于工作目录的行为(在 beta1 中已损坏)。(Jon Rowe)
- 阻止 RSpec 篡改包含
line_number
或default_path
的子字符串的文件名。(Matijs van Zuijlen)
rspec-expectations 2.99.0.beta2
弃用
- 弃用从
expect { }.not_to change { }
链式调用by
、by_at_least
、by_at_most
或to
。文档一直都说这些对于否定形式不受支持,但现在它们在 RSpec 3 中明确引发错误。(Myron Marston) - 更改
expect { }.not_to change { x }.from(y)
的语义。在 RSpec 2.x 中,此期望只有在x
以y
的值开头并发生更改时才会失败。如果它以不同的值开头并发生更改,它将通过。在 RSpec 3 中,只有当值以y
开头且没有发生更改时,它才会通过。(Myron Marston) - 弃用
matcher == value
作为matcher.matches?(value)
的别名,支持matcher === value
。(Myron Marston) - 弃用
RSpec::Matchers::OperatorMatcher
,支持RSpec::Matchers::BuiltIn::OperatorMatcher
。(Myron Marston) - 弃用与 Test::Unit 和 minitest 的自动集成。相反,在适当的测试用例基类中包含
RSpec::Matchers
。(Myron Marston) - 弃用将 DSL 生成的自定义匹配器上的
#expected
视为数组,当只传递 1 个参数给匹配器方法时。在 RSpec 3 中,它将是单个值,以便使差异正常工作。(Jon Rowe)
rspec-expectations 3.0.0.beta2
3.0.0 的重大更改
- 删除对使用
Rspec
或Spec
访问RSpec
常量的弃用支持。(Myron Marston) - 删除弃用
RSpec::Expectations.differ=
。(Myron Marston) - 删除对弃用
expect(...).should
的支持。(Myron Marston) - 明确禁止使用
by
、by_at_least
、by_at_most
或to
的expect { }.not_to change { }
。这些从未被支持,但没有引发明确的错误。(Myron Marston) - 为所有匹配器提供
===
而不是==
作为matches?
的别名。===
的语义更接近 RSpec 匹配器而不是==
。(Myron Marston) - 删除弃用
RSpec::Matchers::OperatorMatcher
常量。(Myron Marston) - 使
RSpec::Expectations::ExpectationNotMetError
子类化Exception
而不是StandardError
,以便它们可以绕过最终用户代码中的裸rescue
(例如,当期望是从 rspec-mocks 桩实现中设置的时)。(Myron Marston) - 删除 Test::Unit 和 Minitest 4.x 集成。(Myron Marston)
增强功能
- 简化
be
匹配器在匹配以下内容时的失败消息:true
、false
和nil
。(Sam Phippen) - 更新匹配器协议和自定义匹配器 DSL,以更好地与新的
expect
语法保持一致。如果你想让你的匹配器与多个版本的 RSpec 保持兼容,可以将新名称别名为旧名称。(Myron Marston)failure_message_for_should
=>failure_message
failure_message_for_should_not
=>failure_message_when_negated
match_for_should
=>match
match_for_should_not
=>match_when_negated
- 改进从
change
匹配器生成的描述。(Myron Marston) - 添加对使用
and
和or
的复合匹配器表达式的支持。只需将它们链接到任何现有匹配器即可创建表达式,例如expect(alphabet).to start_with("a").and end_with("z")
。(Eloy Espinaco) - 添加
contain_exactly
作为match_array
的更清晰版本。请注意,它期望预期数组被展开为单个参数:expect(array).to contain_exactly(1, 2)
与expect(array).to match_array([1, 2])
相同。(Myron Marston) - 更新
contain_exactly
/match_array
,以便它可以匹配其他非数组集合(例如Set
)。(Myron Marston) - 更新内置匹配器,以便它们可以接受匹配器作为参数,允许你以任意方式组合匹配器。(Myron Marston)
- 添加
RSpec::Matchers::Composable
mixin,它可以用来使自定义匹配器也具有可组合性。注意,通过RSpec::Matchers.define
定义的自定义匹配器已经具有此特性。(Myron Marston) - 为内置匹配器定义名词短语别名,这些别名可以在创建组合匹配器表达式时使用,从而使表达式更易读,并提供更好的错误消息。(Myron Marston)
- 添加
RSpec::Machers.alias_matcher
,以便用户可以定义自己的匹配器别名。匹配器的description
将反映备用匹配器名称。(Myron Marston) - 添加显式
be_between
匹配器。be_between
长期以来一直作为动态谓词匹配器工作,但错误消息不佳。新的匹配器提供了更好的错误消息。(Erik Michaels-Ober) - 增强
be_between
匹配器,以允许进行inclusive
或exclusive
比较(例如,包含最小值/最大值或不包含最小值/最大值)。(Pedro Gimenez) - 通过仅在使用比较运算符时才说明它令人困惑,使
not_to be #{operator}
的错误消息不那么令人困惑。(Prathamesh Sonpatki) - 改进使用
Time
或DateTime
对象时eq
匹配器的错误消息,以便包含完整的亚秒精度。(Thomas Holmes, Jeff Wallace) - 添加
output
匹配器,用于预期块输出to_stdout
或to_stderr
。(Luca Pette, Matthias Günther) - 在使用
have_xyz
匹配器时,将提供的块转发到has_xyz?
方法调用。(Damian Galarza) - 提供与Minitest 5.x的集成。在加载minitest后,需要
rspec/expectations/minitest_integration
,以便将rspec-expectations与minitest一起使用。(Myron Marston)
错误修复
- 修复使用错误的预期值(yujinakayama)时的错误匹配器描述
- 修复
expect { }.not_to change { }.from(x)
,以便匹配器仅在起始值为x
时通过。(Tyler Rick, Myron Marston) - 修复哈希差异,以便它可以正确地着色,并且在执行差异时不会考虑尾部逗号。(Jared Norman)
- 修复内置匹配器,以便在提供错误类型的对象进行匹配时正常失败,而不是引发
ArgumentError
,以便它们在复合匹配器表达式(如expect([1.51, "foo"]).to include(a_string_matching(/foo/), a_value_within(0.1).of(1.5))
中正常工作。(Myron Marston)
弃用
- 保留对RSpec 2匹配器协议的支持(例如,用于第三方扩展 gem 中的匹配器,如
shoulda
),但它将打印弃用警告。(Myron Marston)
rspec-mocks 2.99.0.beta2
弃用
- 弃用
RSpec::Mocks::Mock
,转而使用RSpec::Mocks::Double
。(Myron Marston) - 弃用
RSpec::Mocks.setup
的host
参数。相反,应该直接在使用RSpec模拟功能的范围内包含RSpec::Mocks::ExampleMethods
。(Sam Phippen) - 弃用在每次测试生命周期之外使用任何rspec-mocks的功能(例如,从
before(:all)
钩子中使用)。(Myron Marston) - 弃用在另一个示例中重复使用测试替身。(Myron Marston)
- 弃用
and_return { value }
和不带参数的and_return
。(Yuji Nakayama)
rspec-mocks 3.0.0.beta2
3.0.0 的重大更改
- 将
RSpec::Mocks::Mock
重命名为RSpec::Mocks::Double
。(Myron Marston) - 更改在其他测试框架中集成rspec-mocks的方式。现在您需要在测试上下文中包含
RSpec::Mocks::ExampleMethods
。(Myron Marston) - 防止RSpec模拟的替身和部分替身在每次测试生命周期之外使用(例如,从
before(:all)
钩子中使用)。(Sam Phippen) - 删除
RSpec::Mocks.setup
的host
参数。相反,应该直接在使用RSpec模拟功能的范围内包含RSpec::Mocks::ExampleMethods
。(Sam Phippen) - 如果在重置测试替身后尝试使用它们,则使测试替身引发错误,以帮助在您意外保留对测试替身的引用并在另一个示例中尝试重复使用它们时发现问题。(Myron Marston)
- 删除对不带参数的
and_return { value }
和and_return
的支持。(Yuji Nakayama)
增强功能
- 添加
receive_message_chain
,它为新的allow/expect语法提供了旧的stub_chain
的功能。使用它就像这样:allow(...).to receive_message_chain(:foo, :bar, :bazz)
。(Sam Phippen). - 更改参数匹配器以使用
===
作为其主要匹配协议,因为它们的语义与case或rescue语句(它使用===
进行匹配)的语义类似。(Myron Marston) - 添加
RSpec::Mocks.with_temporary_scope
,它允许您在任意位置(例如before(:all)
钩子)创建临时rspec-mocks作用域。(Myron Marston) - 在使用验证替身检查arity时,支持关键字参数。(Xavier Shay)
错误修复
- 修复3.0.0.beta1中的回归,该回归导致
double("string_name" => :value)
停止工作。(Xavier Shay) - 修复rspec-mocks和rspec-core的交互方式,以便如果用户定义了一个与
RSpec::Mocks::ArgumentMatchers
中的方法同名的let
,则用户的let
优先。(Michi Huber, Myron Marston) - 修复验证替身,以便它们的方法与它们验证的接口的可见性(公共、受保护或私有)匹配。(Myron Marston)
- 修复验证的空对象替身,以便它们不会错误地报告它们响应任何内容。它们只响应它们验证的接口上可用的方法。(Myron Marston)
- 修复在没有显式配置的情况下使用旧的
:should
语法的弃用警告,以便当扩展 gem(如rspec-rails)调用config.add_stub_and_should_receive_to
时,它不再被静音。(Sam Phippen) - 修复
expect
语法,以便当您实际上没有这样做时,它不会错误地发出“您正在覆盖此存根的先前实现”警告。(Myron Marston) - 修复在子类上使用
any_instance.unstub
时,父类已经调用了any_instance.stub
。(Jon Rowe) - 修复
stub_chain
/receive_message_chain
中的回归,该回归导致在将参数传递给存根方法时引发ArgumentError
。(Sam Phippen) - 在存根嵌套常量时,正确存根一直到最底层的未定义父模块。(Xavier Shay)
- 当验证类替身的常量未定义时,引发
VerifyingDoubleNotDefinedError
。(Maurício Linhares) - 删除
Double#to_str
,它会导致令人困惑的raise some_double
行为。(Maurício Linhares)
rspec-rails 2.99.0.beta2
弃用
- 弃用脚手架和请求规范生成器的
--webrat
选项(Andy Lindeman) - 弃用在控制器规范中使用
Capybara::DSL
(例如,visit
)。更适合在功能规范(spec/features
)中使用capybara。(Andy Lindeman)
错误修复
- 使用
__send__
而不是send
来防止命名冲突(Bradley Schaefer) - 支持Rails 4.1。(Andy Lindeman)
- 正确加载ActiveSupport以支持Rails 4.1中的更改。(Andy Lindeman)
- 如果
ApplicationController
不存在,匿名控制器将继承自ActionController::Base
。(Jon Rowe)
rspec-rails 3.0.0.beta2
3.0.0 的重大更改
- 删除请求规范生成器的
--webrat
选项(Andy Lindeman) Capybara::DSL
中的方法(例如,visit
)不再在控制器规范中可用。更适合在功能规范(spec/features
)中使用capybara。(Andy Lindeman)infer_base_class_for_anonymous_controllers
默认情况下启用。(Thomas Holmes)- 功能规范需要Capybara 2.2.0或更高版本。(Andy Lindeman)
增强功能
- 改进非ActiveModel::Errors实现的
be_valid
匹配器(Ben Hamill)
错误修复
- 使用
__send__
而不是send
来防止命名冲突(Bradley Schaefer) - 支持Rails 4.1。(Andy Lindeman)
- 对具有抽象父级的匿名控制器正确绘制路由。(Billy Chan)
- 正确加载ActiveSupport以支持Rails 4.1中的更改。(Andy Lindeman)
- 如果
ApplicationController
不存在,匿名控制器将继承自ActionController::Base
。(Jon Rowe) - 在需要
rspec/rails
时,需要rspec/collection_matchers
。(Yuji Nakayama)