2016-04-15 8 views
1

Ich versuche zu behaupten, ob alle Ergebnisse entweder Wert A oder Wert b haben. Meine Einrichtung ist wie folgt:Wie ketten/compound matchers in Capybara?

def results 
all('.results li') 
end 

def apply_filter(filter) 
    filter_by(filter) 
end 

def have_product_type(type) 
    have_selector('.type', text: type) 
end 

Nun muss ich behaupten, dass alle Ergebnisse entweder vom Typ A oder Typ B sind

Ich möchte so etwas wie dies zu tun:

apply_filter('A') 
apply_filter('B') 
expect(results).to all(have_product_type('A').or have_product_type('B')) 

Denke nicht, dass Compound-Matcher noch in Capybara unterstützt werden. Es funktioniert für eine Behauptung zu einer Zeit. Für beispiel dies funktioniert:

expect(results).to all(have_product_type('A')) 

Ich habe auch versucht normalen RSpec Matcher aber dann nicht Capybara Verkettungs passen nicht gut mit ihm.

Zum Beispiel funktioniert das auch nicht, da die Methoden Hilfsmethoden sind, die in feature specs via config.include enthalten sind. Ich erhalte nicht definierte Methode Fehler als die have_product_type Methode in globalen Namensraum ist

expect(results.all {|result| result.have_product_type('A') or result.have_product_type('B')}.to be_truthy 

Wie kann ich nach jedem Zustand testen?

Antwort

1

Zusammengesetzte Matcher werden in Capybara unterstützt, solange Sie sicherstellen, dass "rspec/expectations" vor den Capybaras-Matchern erforderlich ist. Eines ist zu beachten, dass in Ihrem Beispiel von

expect(results).to all(have_product_type('A').or have_product_type('B')) 

Capybaras Warteverhalten könnte dies ein Teil von Ihnen machen sehr langsam testen. Dies liegt daran, dass have_product_type ('A') auf Capybara.default_max_wait_time Sekunden wartet, bis ein übereinstimmendes Element 'A' für jedes Element in den Ergebnissen angezeigt wird. Wenn die meisten also 'B' entsprechen, kann die Verzögerung lang sein. In diesem Fall möchten Sie wahrscheinlich für eine Änderung auf der Seite stattdessen prüfen, ob der Filter angewendet wurden anzeigt, und dass nach wait: false den have_selector Matcher in Ihrer Erwartung verwendet passieren (oder die Erwartung, in einem using_wait_time(0){ expect ... } Block ausführen.

Hinweis: Sie können auch umsetzen, was Sie versuchen zu nur um mit der Regex-Version des. Text-Option mit so etwas wie

expect(results).to all(have_product_type(/^(A|B)$/')) 
+0

Dank Tom habe ich die Regex-Version für jetzt werde ich die Verbindung Matcher versuchen. sehen Sie, ob das gut mit Warten funktioniert: 0. Danke. – Rahul

Verwandte Themen