不区分大小写的Rspec匹配

And*_*rew 22 ruby rspec case-insensitive capybara

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

"ALL CAPS".should include('All Caps')
Run Code Online (Sandbox Code Playgroud)

pru*_*wan 29

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

page.body.should match(%r{#{string}}i)
Run Code Online (Sandbox Code Playgroud)

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

  • 或者`page.find'li.line-item',text:/#{Awesome Line Item}/i`如果您更喜欢斜杠语法.(在Sublime Text中的正则表达式周围添加括号以获得正确的语法突出显示.) (2认同)

Rob*_*bin 7

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

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

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

所以,如果我这样做expect(page.body).to ...只是工作并解决了问题.

  • 这对我来说确实是个问题,谢谢! (2认同)

pho*_*oet 6

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

"ALL CAPS".should match(/#{Regexp.escape('All Caps')}/i)
Run Code Online (Sandbox Code Playgroud)


bru*_*077 6

如何降低断言的两端?

"ALL CAPS".downcase.should include('All Caps'.downcase)
Run Code Online (Sandbox Code Playgroud)


Dav*_*rse 6

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

expect(page).to have_content_i("All Caps")
Run Code Online (Sandbox Code Playgroud)

这是来源:

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
Run Code Online (Sandbox Code Playgroud)

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