2011-10-07 25 views
11

Tôi đang viết thông số yêu cầu và muốn kiểm tra sự hiện diện của chuỗi "Báo cáo» Báo cáo Lão hóa ". Tôi nhận được một lỗi (không hợp lệ multibyte char) nếu tôi đặt trong nhân vật trong biểu hiện khớp của tôi trực tiếp, vì vậy tôi cố gắng này: page.should have_content("Reports » Aging Reports")Kiểm tra Rspec cho các thực thể html trong nội dung trang

này không kiểm tra với thông điệp:

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

tôi đã thử những thứ như .html_safe mà không thành công. Có cách nào để kiểm tra văn bản có chứa các thực thể html không?

Edit:

Đây là khu vực có liên quan của các nguồn html:

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

+0

Đó là khả năng vì nguồn HTML có chứa một ' »' và không phải là một' » '. Thay đổi HTML để bạn sử dụng '»' thay vì '» '. HTML được hiển thị thực tế là gì? Phần '» 'của nguồn HTML hay được định nghĩa là' » 'trong nguồn HTML? Vui lòng cho chúng tôi biết mã nguồn HTML. Bạn không chắc chắn tại sao "mong đợi" hiển thị '»' thay vì '»'. – Zabba

+0

HTML thực sự là » » là một dạng khác của thực thể » mà tôi đã thử, nhưng tôi đã cập nhật câu hỏi. – MWean

+0

Dường như RSpec đang chuyển đổi '» 'thành' »' cho bạn. Hãy thử bao gồm các ký tự thực tế trong thử nghiệm của bạn. – thomasfedb

Trả lời

1

Tôi tìm thấy một workaround cho thời gian được sử dụng một regex thay vì một chuỗi:

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

Điều này nhận được văn bản của số breadcrumbs div, chứa văn bản tôi ' m tìm kiếm, vì vậy phạm vi của trận đấu bị giới hạn. Điều này hoạt động tốt, nhưng tôi vẫn muốn biết làm thế nào để phù hợp với các thực thể html cụ thể.

6

Bạn có thể có giao diện thử nghiệm tại nguồn nguyên liệu của trang của bạn quá:

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+ 

Với những gì đã nói Tôi không chắc đó là giải pháp thanh lịch nhất. Giả sử có một lớp có tên .breadcrumb xung quanh các liên kết của bạn, bạn chỉ có thể xác nhận các liên kết có mặt trong 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 

Bằng cách này bạn đang tìm kiếm một cách rõ ràng cho a href của trong khối mẩu bánh mì.

3

html_safe không xóa thẻ html nếu đó là những gì bạn muốn.

Nếu bạn sẽ xóa thẻ html trước khi kiểm tra, bạn có thể sử dụng đá quý sanitize.

# in Gemfile 
gem 'sanitize' 

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

Đôi khi giải pháp đơn giản nhất là một trong những quyền và những thứ chỉ làm việc ...

page.should have_content("Reports » Aging Reports") 
Các vấn đề liên quan