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

时间:2014-02-17 21:35:02

标签: ruby rspec ruby-2.0

在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-configurationhttps://www.relishapp.com/rspec/rspec-expectations/docs/syntax-configuration表示默认情况下仍支持此语法。

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

3 个答案:

答案 0 :(得分:4)

如果你想在describe/it块之外使用它,似乎你必须先启用它,尽管文档声明它默认启用。我假设只有enable by default表示在规范文件[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

答案 1 :(得分:3)

rspec-expectations是将should添加到每个对象的gem。要求rspec仅加载rspec元gem(它纯粹是一个提供所有rspec的gem install),但不会自动加载rspec-expectations。如果您愿意,rspec-core允许您将其配置为使用除了rspec-expectations之外的其他内容(例如minitest提供的stdlib断言,或者错误),但默认情况下它会加载rspec-expectations。为实现此目的,如果您没有明确配置它,它会等待第一次describe调用之前加载rspec-expected,因为历史原因,为explained in my blog post

因此,如果您希望立即提供Object#should,则只需要rspec/expectations。请注意,我们计划更改RSpec 4中的默认值,以便在没有额外配置的情况下should不会自动可用。另外,正如@JonRowe所提到的,这种用法并不是真正的用途。您可以从任何上下文调用foo.should,但是用于should的匹配器方法并非在所有上下文中都可用。您需要在您的上下文中加入RSpec::Matchers才能使其可用。还要考虑切换到expect语法:它是一种较新的非monkeypatching语法,我们一直是recommending for a while now

答案 2 :(得分:1)

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