2017-05-27 97 views
0

在我的Ruby on Rails的4.2應用程序的測試存在,在頁面上我有一個在課堂上會轉化爲網頁前端在變化的條件後端規則Rspec的/水豚 - 一類或其他類

<div id="content"> 
    <i class='<% if x=true %>glyphicon glyphicon-thumbs-down<% else> glyphicon glyphicon-thumbs-up ><% end %>' </i> 
     this is the message. 
</div> 

如何使用rspec 3/capybara檢查頁面是否包含類glyphicon-thumbs-down或類glyphicon-thumbs-up?

我嘗試下面的代碼,但它失敗:

it "should sheck one of the 2 classes presence" do 
    expect(page).to have_css '.glyphicon-thumbs-down' || expect(page).to have_css '.glyphicon-thumbs-up' 
end 

我收到以下錯誤消息:

syntax error, unexpected tIDENTIFIER, expecting keyword_end (SyntaxError) 
+0

難道你不應該準備測試,包括後端規則,以便你確切地知道哪個類將在頁面上呈現? – BoraMa

+0

因爲它是後端的隨機規則(這是運氣的遊戲),所以我無法在我的測試套件中預測它 – Mathieu

回答

2

多個OR-ed css選擇器可以用逗號分隔。嘗試以下方法:(我加了#contenti選擇,以便查詢更具體)

it "should sheck one of the 2 classes presence" do 
    expect(page).to have_css '#content i.glyphicon-thumbs-down,#content i.glyphicon-thumbs-up' 
end 

然而,而不是做這個,我會建議您嘗試,使測試的行爲在精確定義的方式,並測試規範中的一個類。看看this SO question及其答案,以各種方式在測試中對隨機數生成器進行存根或預設。

+0

非常感謝,但是非常感謝 – Mathieu

0

你的錯誤是從該行:

expect(page).to have_css 'glyphicon-thumbs-down' || expect(page).to have_css 'glyphicon-thumbs-up' 

你只需要添加一些parens,那麼它將是有效的語法:

expect(page).to(have_css('glyphicon-thumbs-down')) || expect(page).to(have_css('glyphicon-thumbs-up')) 

雖然不會解決您的問題,因爲如果左邊的條件失敗,rspec將退出而不運行下半部分。

一種工作方法可以是將條件評估爲布爾變量,然後將其傳遞給單個rspec期望值。這樣做需要使用核心水豚方法has_css測試對CSS的存在,從RSpec的匹配器包不have_css?

selectors = ['.glyphicon-thumbs-down', '.glyphicon-thumbs-up'] 
glyph_exists = selectors.any? do |selector| 
    page.has_css? selector 
end 
expect(glyph_exists).to be true 

還請注意,我已經添加.到選擇字符串這是必要的,因爲它是一個CSS類。

+0

這對每次調用'has_css?'都有負面影響,等待Capybara.default_max_wait_time秒後再檢查下一個一個如果不匹配。 –

+0

是的。爲了解決這個問題,他需要等待很短的時間,然後救出錯誤返回false。雖然 –

3

首先,你正在檢查一個類名,所以你需要在類名前面加上.,使它成爲一個CSS類選擇器。然後,你可以使用RSpec的or匹配組合子

expect(page).to have_css('.glyphicon-thumbs-down').or(have_css '.glyphicon-thumbs-up') 

但它的第一個重試的缺點/檢查第二前等待Capybara.default_max_wait_time秒。如果你知道頁面已加載,因此不需要重試,你可以指定一個0 /假的等待時間/等待

expect(page).to have_css('.glyphicon-thumbs-down', wait: false).or(have_css '.glyphicon-thumbs-up', wait: false) 

但是,它可能是罰款,使用正常的CSS ,

只是檢查是否有任一元素
expect(page).to have_css('.glyphicon-thumbs-down, .glyphicon-thumbs-up') 
+0

非常感謝您的回答,我向Borama提出了一些建議,因爲他的建議與我需要的建議匹配(您的最後一個建議)2分鐘之前:)確實,我必須等待服務器ajax響應並且不能使用0等待時間,所以下注首先是wait_for_ajax,然後是have_css('。glyphicon-thumbs-down,.glyphicon-thumbs-up') – Mathieu

+0

@Mathieu你應該不需要'wait_for_ajax' ,'have_css'將等待兩個選擇器中的一個匹配(直到Capybara.default_max_wait_time秒) –

+0

我等待ajax,因爲我有一個ajax請求發送到服務器來檢查數據並將其發送回視圖。我知道have_css會等待...但有時在我的具體情況下,我不得不使用wait_for_ajax來工作。不過感謝您提供更多有力的信息 – Mathieu