RSpec与Capybara中可设置别名替代expect(page).to沿用should语法吗?
RSpec 旧版should语法兼容方案
方案1:使用RSpec原生支持的兼容配置
目前RSpec 3及以上版本只是默认关闭了should语法,并未完全移除内置支持,你可以直接通过配置文件开启,无需自定义别名:
在spec_helper.rb或rails_helper.rb中添加如下配置:
RSpec.configure do |config| config.expect_with :rspec do |expectations| # 同时兼容 expect 和 should 两种语法 expectations.syntax = [:should, :expect] end end
配置完成后,你原来的page.should have_text('foo')、page.should_not have_text('bar')这类代码都可以直接正常运行。
方案2:自定义别名实现(适用于后续官方完全移除should支持的场景)
如果后续RSpec官方完全删除了should语法的内置实现,你可以通过给Ruby基础Object类添加扩展方法的方式,实现你需要的映射关系:
- 新建扩展文件
spec/support/rspec_should_compatibility.rb,内容如下:
# 旧版RSpec should语法兼容补丁 class Object # 映射到 expect(self).to def should(matcher = nil, message = nil) expect(self).to(matcher, message) end # 映射到 expect(self).not_to def should_not(matcher = nil, message = nil) expect(self).not_to(matcher, message) end end
- 在
spec_helper.rb中加载上述扩展文件,如果是Rails项目可以直接添加如下配置自动加载所有support目录下的扩展:
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
注意事项
- 上述自定义补丁属于全局猴子补丁,如果你项目中的其他依赖也定义了
should/should_not方法,可能会出现命名冲突 - 补丁已兼容原生
should语法的所有参数规范,包括可选的自定义错误提示参数,可直接替换原生实现 - 该补丁对所有Ruby对象生效,包括Capybara的
page对象、ActiveRecord实例等,不需要针对特定类型单独适配
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

