2011-10-07 49 views
11

我正在編寫一個請求規範,並想測試字符串「報告»老化報告」的存在。我得到一個錯誤(無效的多字節字符),如果我把在直接我匹配表達的角色,所以我嘗試這樣做:page.should have_content("Reports » Aging Reports")頁面內容中的html實體的Rspec測試

這失敗消息的測試:

expected there to be content "Reports » Aging Reports" in "\n Reports » Aging Reports\n

我已經嘗試過像.html_safe這樣的東西,但沒有成功。有沒有辦法測試包含html實體的文本?

編輯:

這裏的HTML源代碼的相關區域:

<a href="/reports">Reports</a> &raquo; <a href="/aging_reports">Aging Reports</a>

+0

這可能是因爲HTML源代碼包含了'»'而不是''»。更改HTML,以便使用'»'而不是'»。什麼是實際呈現的HTML?是HTML源代碼的'»'部分還是在HTML源代碼中定義爲'»'?請向我們展示源HTML。不知道爲什麼「預期」顯示「»」而不是「»」。 – Zabba

+0

HTML實際上是» »是我試過的»實體的另一種形式,但我更新了這個問題。 – MWean

+0

看起來RSpec正在將'»'轉換成'»'給你。嘗試在測試中包含實際的字符。 – thomasfedb

回答

1

我發現的時候解決方法是使用正則表達式而不是字符串:

find('#breadcrumbs').text.should match(/Reports . Aging Reports/)

這得到了breadcrumbs div的文本,其中包含文本I'米尋找,所以比賽的範圍是有限的。這工作正常,但我仍然很想知道如何匹配特定的html實體。

6

你可以測試一下你的頁面的原始源太:

breadcrumb = '<a href="/reports">Reports</a> &raquo; <a href="/aging_reports">Aging Reports</a>' 
page.body.should include(breadcrumb) 
expect(page.body).to include(breadcrumb) # rspec 2.11+ 

雖這麼說,我不知道這是最好的解決方法。假設有一個名爲在你的鏈接,您可以只驗證環節存在的專區內.breadcrumb類:

within '.breadcrumb' do 
    page.should have_css('a', text: 'Reports') 
    page.should have_css('a', text: 'Aging Reports') 
    expect(page).to have_css('a', text: 'Reports') # rspec 2.11+ 
    expect(page).to have_css('a', text: 'Aging Reports') # rspec 2.11+ 
end 

這樣你明確地尋找一個HREF的麪包屑塊內。

3

html_safe不會刪除html標記,如果這就是你想要的。

如果您在測試之前刪除html標籤,您可以使用sanitize gem。

# in Gemfile 
gem 'sanitize' 

# in testfile 
require 'sanitize' 
html = Sanitize.clean(page.body.text) 
html.should have_content("Reports &raquo; Aging Reports") 
0

有時,最簡單的解決方法是正確的,事情就工作...

page.should have_content("Reports » Aging Reports")