rspec的.should在Ruby 2中失败(在describe / it块之外)?

在Ruby 2中,使用gem rspec 2.14.1(Ubuntu的最新版本),未安装Rails,为什么会失败?

require 'rubygems' require 'rspec' 3 .should == 3 NoMethodError: undefined method `should' for 3:Fixnum 

多年来我一直依赖方便的习语x .should == y

https://www.relishapp.com/rspec/rspec-expectations/v/2-14/docs/syntax-configuration和https://www.relishapp.com/rspec/rspec-expectations/docs/syntax-configuration say默认情况下仍支持此语法。

编辑:在标题中添加“outside describe / it block”,因为这似乎是根本原因。

如果你想在describe/it块之外使用它,你似乎必须先启用它,尽管文档声明它默认启用。 我假设enable by default仅表示在spec文件[ source ]中。 例如:

 require 'rubygems' require 'rspec' RSpec.configure do |config| config.expect_with :rspec do |c| c.syntax = :should end end p 3.should == 3 # true 

rspec-expectations是为每个对象添加的gem。 要求rspec仅加载rspec元gem(它纯粹是一个提供所有rspec的gem install ),但不会自动加载rspec-expected。 如果您愿意,rspec-core允许您将其配置为使用除了rspec-expectations之外的其他内容(例如minitest提供的stdlib断言,或者错误),但默认情况下它会加载rspec-expectations。 为了实现这一点,如果你没有明确地配置它,它会等到第一次describe调用之前加载rspec-expected,这是出于历史原因,正如我在博客文章中所解释的那样 。

因此,如果您想使Object#should立即可用,您只需要要求rspec/expectations 。 请注意,我们计划更改RSpec 4中的默认值,以便在没有额外配置的情况下不应自动提供。 另外,正如@JonRowe所提到的,这种用法并不是真正的用途。 您可以从任何上下文调用foo.should ,但是在所有上下文中都不能使用要使用的matcher方法。 您需要在您的上下文中包含RSpec::Matchers才能使它们可用。 考虑也转换到expect语法:它是我们一段时间以来推荐的更新的非monkeypatching语法。

它在RSpec示例之外不受支持,例如在describe块内的it块内。 请不要以这种方式使用它。