2012-07-03 82 views
19

我正在写水豚测试并使用Rspec进行断言。我的测试失败了,因为应用了CSS样式,导致文本全部大写。我如何重写这个以便它不区分大小写的断言?不区分大小写的Rspec匹配

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

回答

27

这里的改进上phoet的解决方案:

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

不幸的是,语法这里强调没有做多义(它看起来在崇高的文本完美的罚款)

+0

美丽的解决方案 – bruno077

+0

这也适用于水豚发现者。例如: 'page.find'li.line-item',text:%r {Awesome Line Item} i' –

+2

或'page.find'li.line-item',text:/#{Awesome Line Item }/i',如果你喜欢斜杠语法。 (在Sublime Text的正则表达式中添加括号以获得正确的语法高亮。) – LouieGeetoo

6

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

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

如何降低声明的两端?

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

这个解决方案实际上是我遇到的不同匹配器场景中最通用的。即使它有点丑陋,但它起作用 – Andrew

+0

如果你想隐藏一点丑陋,你可以将它抽象为自定义方法嗯 – bruno077

2

另外,如果你是使用水豚, 您可以使用不区分大小写的 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文本。我花了一段时间仔细研究源代码,但仍然无法弄清楚为什么这会起作用。

+0

水豚的哪个版本是这样的?我不记得水豚有默认情况下不区分大小写的匹配器 – prusswan

+0

你碰巧也在使用webrat吗? – prusswan

+0

嗯,我建议你用'puts find('h1').text'和/或'puts find('h1')来检查,看看到底发现了什么。在我的最后,我回到你的例子中的'ALL CAPS',这是正确的失败。 – prusswan

7

我只遇到此问题时:

  • 使用吵闹鬼司机。 (我不知道是否这也与其他车手发生)

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

所以,如果我做expect(page.body).to ...它只是工作和解决的问题。

+2

这正是我的问题,谢谢! – mistertim

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/有在哪里藏匿在你的项目树中的自定义匹配定义的信息。

相关问题