usereste expect ... change
per verificare che un particolare metodo di chiamata cambia - o non cambia - qualche altro valore. In questo caso:
expect { click_button "Create my account" }.not_to change(User, :count)
causerà RSpec per effettuare le seguenti operazioni:
- Run
User.count
e prendere nota del valore restituito. (Questo può essere specificato come un ricevitore e un nome di metodo, come (User, :count)
nel tuo esempio, o come un blocco arbitrario di codice, come { User.count }
.
- Run
click_button "Create my account"
che è un metodo Capybara che simula un clic del mouse su un link. ..
- Run
User.count
nuovo
- confrontare i risultati del # 1 e # 3 Se si differenziano, l'esempio non riesce Se sono uguali, passa
altri modi per utilizzare expect ... change
:..
expect { thing.destroy }.to change(Thing, :count).from(1).to(0)
expect { thing.tax = 5 }.to change { thing.total_price }.by(5)
expect { thing.save! }.to raise_error
expect { thing.symbolize_name }.to change { thing.name }.from(String).to(Symbol)
Alcuni documenti sono here.
Come questo è un po 'arcano, e non è affatto necessario capire come funziona per usarlo. Una chiamata a expect
sta definendo una struttura per rspec da eseguire, utilizzando la DSL personalizzata di rspec e il sistema di "matcher". Gary Bernhardt ha un piuttosto elegante screencast in cui sostiene che il mistero di rspec in realtà cade naturalmente da un linguaggio dinamico come il rubino.Non è una buona introduzione a utilizzando rspec, ma se sei curioso di sapere come funziona, potresti trovarlo interessante.
UPDATE
Dopo aver visto il tuo commento su un'altra risposta, aggiungerò un po 'l'ordine delle operazioni. Il trucco non intuitivo è che è il match (change
in questo caso) che esegue tutti i blocchi. expect
ha un lambda, not_to
è un alias per should_not
il cui compito è quello di passare il lambda al matcher. Il matcher in questo caso è change
che sa eseguire il proprio argomento una volta, quindi esegue il lambda che è stato passato (quello da expect
), quindi esegue nuovamente il proprio argomento per vedere se le cose cambiano. È complicato perché sembra che la linea debba essere eseguita da sinistra a destra, ma dal momento che la maggior parte dei pezzi passa semplicemente attorno a blocchi di codice, possono e li possono mescolare in qualsiasi ordine sia più sensato per il matcher.
Non sono un esperto degli interni di rspec, ma questa è la mia comprensione dell'idea di base.
fonte
2012-05-18 01:55:41
Questo non è Capybara, è RSpec. –
@RyanBigg Grazie, l'ho corretto. – Bedasso