2011-10-07 9 views
11

リクエスト仕様を書いており、 "Reports»Aging Reports"という文字列の有無をテストしたいと思います。私は、直接私のマッチャー式に文字を入れた場合、私は、エラー(無効なマルチバイト文字)を取得するので、私はこの試みた:私は「ページコンテンツのhtmlエンティティのRspecテスト

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

:これは、メッセージを使用してテストを失敗したpage.should have_content("Reports » Aging Reports")

を何も成功しなかった.html_safeのようなものを試しました。 htmlエンティティを含むテキストをテストする方法はありますか?

編集:

ここでhtmlソースの関連するエリアです:

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

+0

HTMLソースは '»'と 'ない»が'含まれているためと思われます。 '»'の代わりに '»'を使うようにHTMLを変更してください。実際にレンダリングされるHTMLとは何ですか? HTMLソースの '»'部分か '»'と定義されていますか?ソースHTMLを表示してください。しかし、 "»"ではなく "»"と表示されているのはなぜか分かりません。 – Zabba

+0

HTMLは実際には»です。»は私が試した»エンティティの別の形式ですが、質問を更新しました。 – MWean

+0

RSpecが '»'を '»'に変換しているようです。あなたのテストで実際のキャラクターを含めてみてください。 – thomasfedb

答えて

1

が、私は時間のための回避策はその代わりに、文字列の正規表現を使用しているが見つかりました:

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

これは、breadcrumbs divのテキストを取得します。このテキストには、探しているので、試合の範囲が限られています。これは正常に動作しますが、私はまだ特定の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という名前のクラスがあると仮定するとdiv要素の中に存在している:

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")