2011-11-29 56 views
6

我想要做一些基本檢查,以確保一個XML站點地圖被正確的生產,但have_selector似乎並不能夠檢測標籤:如何使用rspec have_selector方法驗證XML?

require 'spec_helper' 

describe SitemapController do 

    render_views 

    before(:all) do 
    # code to generate factory data 
    # ... 
    end 

    # illustrating the problem 
    it "should be able detect nodes that are definitely present" do 
    get :index 
    response.should have_selector('url') 
    end 
end 

我每次運行測試,我得到以下錯誤:

RSpec::Expectations::ExpectationNotMetError: expected css "url" to return something 

站點地圖被生產,並且當我調試RSpec的測試,並期待在response對象我可以看到XML內容:

ruby-1.9.2-p180 :001 > response.body 
=> "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n <url>\n <loc>http://test.host/panel ... 

我的站點地圖由SitemapController生成,視圖位於views/sitemap/index.builder.xml

爲什麼沒有選擇器踢?

回答

3

水豚不支持XML響應。它總是使用Nokogiri::HTML來解析內容,當給定XML時會產生意想不到的結果。

添加XML支持有been requested但被水豚的維護人員拒絕。

+0

這對John很有幫助。你知道應該採取什麼方法,而不是水豚嗎?我沒有意識到需要一個瀏覽器模擬器,因爲我只想解析文檔 - ty –

2

改爲使用should have_xpath('//url')have_selector用於CSS。

有關更多信息,請參見the Capybara README

+0

嗨大衛。我仍然遇到'response.should have_xpath('// url')''返回'期望的xpath「// url」返回一些東西'的問題。爲了踢水豚,我甚至嘗試在測試中添加':type =>:request'標記,但仍然失敗 –

1

據我所知have_selector(或have_xpath)只能來自Webrat或Capybara。你對John的評論是正確的,你不需要瀏覽器模擬器來測試API。

由於您使用visit而不是get AFAIK,因此您可能會錯誤地調用Webrat或Capybara。所以它們匹配的變量可能永遠不會被頁面填充,因此總是返回false。

如果響應內容類型正確設置爲XML,則Rails應該本機處理XML文檔。嘗試使用assert_tagassert_content測試助手作爲基本檢查。

我只想用引入nokogiri解析XHTML和運行正常的RSpec測試針對:

xml = Nokogiri::XML(response.body) 
xml.css("expression").size.should == 1 
+0

非常有幫助,謝謝Andrew。我會試試看,並告訴你結果如何 –