不区分大小写的Rspec匹配

时间:2012-07-03 17:39:32

标签: ruby rspec capybara case-insensitive

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

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

6 个答案:

答案 0 :(得分:28)

以下是对phoet解决方案的改进:

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

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

答案 1 :(得分:7)

我在以下情况下遇到过这个问题:

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

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

所以,如果我做expect(page.body).to ...它就会起作用并解决问题。

答案 2 :(得分:6)

如何使用正则表达式来执行此操作?

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

答案 3 :(得分:3)

如何降低断言的两端?

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

答案 4 :(得分:3)

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/包含有关在项目树中存储自定义匹配器定义的位置的信息。

答案 5 :(得分:2)

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

<h1>ALL CAPS</h1>

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

<击>

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

<h1 style="text-transform: uppercase">Title Case</h1>

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中的文本进行测试。我花了一些时间挖掘源代码,但仍然无法弄清楚为什么会这样。