2015-12-14 56 views
0

我正在編寫一個測試來檢查某個頁面上是否存在OpenGraph元標記。測試已經寫成如下。測試以確保response.body在頁面頭部包含正確的標籤

test "og tags are present" do 
    get :bid, id: auctions(:name) 
    assert_response :success 
    assert_select "head" do 
    assert_select "meta" do 
     assert_match /og:title/, response.body 
     assert_match /og:type/, response.body 
     assert_match /og:url/, response.body 
     assert_match /og:image/, response.body 
     assert_match /og:description/, response.body 
    end 
    end 
end 

我覺得還有一個更簡單的方法來做到這一點可能不看在assert_match調用整個response.body。我只想看看嵌套在head標籤中的meta標籤內的內容。任何幫助非常感謝

回答

2

也許不太可能,但也較不詳細。你可以用類似嘗試:

test "og tags are present" do 
    get :bid, id: auctions(:name) 
    assert_response :success 
    assert_select "head" do 
    assert_select "meta" do 
     ['title', 'type', 'url', 'image', 'description'].each do |mt| 
     assert_match Regexp.new('og:' + mt), response.body 
     end 
    end 
    end 
end 

如果有一種方法來檢索head所有嵌套的meta標籤,你可以這樣做: 是否使用Capybara

# metatags => array with head meta tags 
metatags.each do |mt| 
    assert_match Regexp.new('og:' + mt), response.body 
end 

更新?因爲有了這個工具,你可以用這個簡單的命令檢索的元標籤:

page.find(:xpath, '//html/head/meta', visible: false) 

希望這將有助於

+0

感謝,這應該工作。 –

+0

謝謝,很好的解決方案。 –

0

使用正則表達式是不是最好的方式來測試HTML輸出,除非它的一個非常簡單的字符串,因爲它是非常容易出錯的。以此爲例:

assert_match /og:title/, '<meeta property="og:title" content="The Rock" />' 

由於Regexps不支持HTML,因此會給出錯誤的postive。

相反,你會使用一個HTML解析器像引入nokogiri:

require 'nokogiri' 
doc = Nokogiri::HTML(response.body) 
# Query the document and build a hash out of the open graph tags 
meta = doc.css('meta[property^="og:"]').inject({}) do |result, node| 
    result[node.attr('property')] = node.attr('content') 
    result 
end 

# example data from http://ogp.me/ 
assert_equals "The Rock", meta["og:title"] 
assert_equals "video.movie", meta["og:type"] 
assert_equals "http://www.imdb.com/title/tt0117500/", meta["og:url"] 
assert_equals "http://ia.media-imdb.com/images/rock.jpg", meta["og:image"] 

在這裏,我們只是把打開的圖形標記爲哈希,使我們可以寫自己的內容簡單的斷言。

如果你不關心你能做到這一點,而不引入nokogiri像這樣的內容特性:

assert_false(css_select('meta[property="og:title"]').empty?) 
+0

你可以用'Capybara :: Node :: Simple'來做同樣的事情,它只是在nokogiri之上的糖。 – max