24

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

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

6 回答 6

31

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

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

不幸的是,这里突出显示的语法并没有做太多正义(在 Sublime Text 中看起来非常好)

于 2012-07-18T14:39:31.947 回答
7

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

  • 使用 poltergeist 驱动程序。(我不知道其他驱动程序是否也会发生这种情况)

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

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

于 2014-05-08T12:30:30.217 回答
6

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

"ALL CAPS".should match(/#{Regexp.escape('All Caps')}/i)
于 2012-07-03T18:01:26.163 回答
6

如何降低断言的两端?

"ALL CAPS".downcase.should include('All Caps'.downcase)
于 2012-07-03T18:03:28.650 回答
5

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/ has information on where to stash the custom matcher definitions in your project tree.

于 2017-06-15T19:20:05.600 回答
3

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

于 2012-07-25T15:42:04.773 回答