不区分大小写的Rspec匹配

我正在编写Capybara测试并使用Rspec进行断言。 我的测试失败了,因为正在应用的CSS样式导致文本全部大写。 我怎样才能重写这个,这是一个不区分大小写的断言?

"ALL CAPS".should include('All Caps') 

这是phoet解决方案的改进:

 page.body.should match(%r{#{string}}i) 

不幸的是,这里突出显示的语法不是很正义(在Sublime Text中看起来很完美)

我只遇到这个问题:

  • 使用poltergeist驱动程序。 (我不知道其他司机是否也会这样)

  • 检查page ,而不是page.body的期望: expect(page).to ...

所以,如果我确实expect(page.body).to ...它只是起作用并解决了问题。

如何使用正则表达式来做到这一点?

 "ALL CAPS".should match(/#{Regexp.escape('All Caps')}/i) 

如何降低断言的两端?

 "ALL CAPS".downcase.should include('All Caps'.downcase) 

Rspec语法在4年内发生了显着变化,但这个潜在问题似乎仍然是一个问题。 我的解决方案是构建一个自定义匹配器has_content_i ,它类似于has_content但不区分大小写。 结果调用如下:

 expect(page).to have_content_i("All Caps") 

这是来源:

 RSpec::Matchers.define :have_content_i do |expected| match do |actual| actual.text =~ /#{Regexp.quote expected}/i end failure_message do |actual| "expected to find text #{expected.inspect} case insensitively in #{actual.text.inspect}" end failure_message_when_negated do |actual| "expected to not to find text #{expected.inspect} case insensitively in #{actual.text.inspect}" end end 

http://danielchangnyc.github.io/blog/2014/01/15/tdd2-RSpecMatchers/提供了有关在项目树中存储自定义匹配器定义的位置的信息。

此外,如果您使用的是have_content ,则可以使用不区分大小写的have_content匹配器:

 

ALL CAPS

find('h1').should have_content('All Caps')

更新:我想我错了。 考虑一下:

 

Title Case

puts find('h1').text # TITLE CASE < notice all caps puts find('h1').has_content?('Title Case') # true puts find('h1').has_content?('TITLE CASE') # false puts find('h1').has_content?('title case') # false

我很奇怪,返回的文本是全部大写的(它是如何在CSS之后设置的),但匹配器实际上是在对无格式HTML中的文本进行测试。 我花了一些时间挖掘源代码,我仍然无法弄清楚为什么这样做。