2012-06-25 52 views

回答

37

我建議,而不是試圖找到css樣式,而不是你寫你的測試,以找到CSS類名

通過這種方式,您可以更改基礎CSS樣式,同時保持類相同,並且您的測試仍將通過。

尋找潛在的風格是脆弱的。風格經常變化。根據您的rspecs查找特定的樣式元素會使您的測試更脆弱 - 當您所做的只是更改div的外觀和感覺時,它們更有可能失敗。

將您的測試發現到CSS類使測試更健壯。它允許他們確保代碼正常工作,而不需要在更改頁面樣式時更改代碼。

在這種情況下,具體來說,一個選項可能是定義一個名爲.hidden的css類,它在元素上設置display:none;以隱藏它。

像這樣:

CSS:

.hidden { 
    display:none; 
} 

HTML:

<div class="hidden">HIDE ME!</div> 

水豚:

it {should have_css('div.hidden') } 

這水豚只是尋找具有hidden一個div類 - 如果你需要,你可以使這個匹配器更復雜。

但重點是 - 將樣式附加到css類名,然後將測試綁定到類,而不是樣式。

+11

一般而言,這是一個很好的建議,至少有一個例外:如果您試圖測試某個元素是否對用戶可見。如果是這樣的話,那麼測試一個CSS類的存在是錯誤的,因爲這將測試實現而不是結果,測試點是允許您更改實現並確保獲得相同的結果。實際上,如果你測試一個元素是否對用戶可見,請參閱luacassus的答案。 –

+0

@toasterlovin - 使用良好的css類可以幫助解決這個問題,例如,看到高級前端開發人員使用諸如'.is-hidden {display:none; }'或類似的東西,然後使用JavaScript添加或在頁面加載時呈現。測試這個類的存在將非常穩健;我想說這個問題部分在於前端壞習慣('$(elem).css('display','none');'例如) –

+0

我試圖弄清楚測試實現該元素有一個類,它會隱藏)並測試你關心的實際事物(隱藏的元素)。國際海事組織,這是編寫有用測試的關鍵方面。測試你關心的實際事物意味着你可以重構關於如何得到結果的任何事情,如果你已經正確地重構了測試,你的測試會讓你知道。另一方面,如果您測試實現,那麼只要您更改實現,測試就會毫無用處。 –

12

您可以使用has_css?匹配器。它可以接受:visible選項。欲瞭解更多詳情,您可以檢查文檔:http://rdoc.info/github/jnicklas/capybara/Capybara/Node/Matchers#has_css%3F-instance_method

例如,你可以嘗試:

it { should have_css('div.with-some-class', :visible => true) }

+0

注意':visible => true' - 結果可能不準確: [http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method]( http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method) – bershika

+0

只是想指出':visible'選項的用法可能會令人驚訝,如果使用true '或'false'。我發現使用'visible :::visible'或'visible :::hidden'更清晰。 [見詳情](https://github.com/jnicklas/capybara/commit/83742b008f0719082beb8f6703bc70ba956815fc#diff-da1771677e47ff6a7a70b8119e14102dR58)和[關於這些符號選項的討論](https://github.com/jnicklas/capybara/issues/944) – EricC