8

Ho aggiornato l'intero stack da un progetto basato su Rails 3.0 a 3.1. Ho delle specifiche che passano ma i miei lineamenti sono ora un po 'pignoli. Il problema Attualmente sto avendo è questo passaggio:Capybara: come affermare un determinato numero di elementi esistenti

Then /^I should see (\d+) menu item(?:s)? within "([^"]*)"$/ do |count, selector| 
    page.find(:css, selector, :count => count.to_i) 
end 

E nel film stesso, potrei mettere:

Then I should see 5 menu items within "tr#menu_item_row" 

Il messaggio che ottengo è:

Then I should see 5 menu items within "tr#menu_item_row"          # features/step_definitions/admin_menu_steps.rb:1 
    Ambiguous match, found 5 elements matching css "tr#menu_item_row" (Capybara::Ambiguous) 
    ./features/step_definitions/admin_menu_steps.rb:2:in `/^I should see (\d+) menu item(?:s)? within "([^"]*)"$/' 
    features/admin_menu.feature:30:in `Then I should see 5 menu items within "tr#menu_item_row"' 

Per quanto come posso dire, i 5 elementi corrispondono ai 5 effettivamente trovati. Ho sbagliato a scrivere questo codice o è cambiato qualcosa di importante? Grazie!

risposta

14

Se si desidera controllare 5 elementi non si dovrebbe usare #find come impostazione predefinita poiché Capybara 2.0 questo metodo genera sempre un'eccezione se trova più o meno di un elemento. Questo era un intenzionale e (credo) un buon cambiamento.

affermare che 5 elementi sono presenti un metodo appropriato è un matcher rspec:

expect(page).to have_css(selector, count: count.to_i) 

Non consiglio to set match to prefer_exact come raccomandato da @fontno come nella maggior parte delle situazioni che si desidera Capybara ad un'eccezione se find trova più di un elemento.

2

Sì, questa è una modifica tra le versioni 1.xe 2.x. Puoi vedere tutte le modifiche nel capybara upgrade guide e questo blog post.

Il metodo find ora genera un errore ambiguous match se viene trovato più di un elemento. Se avete solo un paio di esempi si potrebbe fare qualcosa di simile

Then /^I should see (\d+) menu item(?:s)? within "([^"]*)"$/ do |count, selector| 
    page.find(:css, selector, :count => count.to_i, match: prefer_exact) 
end 

o se si dispone di molti esempi come questo si potrebbe modificare la configurazione capibara per compatibilità all'indietro, qualcosa di simile

Capybara.configure do |config| 
    config.match = :prefer_exact 
    config.ignore_hidden_elements = false 
end 

Si può devi modificare questo per farlo funzionare, ma questa è l'idea generale. Vedi i link che menziono sopra, è tutto lì dentro. Spero che questo ti metta nella giusta direzione

+0

': prefer_exact' può essere considerato una cattiva pratica come si può vedere nel post di blog a cui è stato collegato ed è stato aggiunto in Capybara 2.1 in quanto molte persone hanno detto che ne hanno bisogno per compatibilità all'indietro con il proprio codice scritto per 1.x . Penso che sia una cattiva idea consigli di usarlo. –

+0

quindi, perché ho fatto riferimento e collegato all'articolo mi merito un voto negativo? Stavo semplicemente dicendo all'interrogante perché questo è successo e cosa si poteva fare al riguardo. Non ho detto all'interrogante che non avrebbero dovuto aggiornare la funzione e lo avrebbero fatto solo in questo modo. Basta sottolinearlo come la domanda era "ha fatto qualcosa cambiare?" – fontno

+0

L'upvoting perché ha effettivamente focalizzato la mia attenzione sulla differenza tra le impostazioni 'match'. –

Problemi correlati