在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表示默认情况下仍支持此语法。
编辑:为标题添加了“outside describe / it block”,因为这似乎是根本原因。
答案 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
块内。请不要以这种方式使用它。