2011-09-28 15 views
13

Ho un test del genere:Assert aspettative modificare più all'interno di una singola lambda richiesta

lambda { post("/api/users", parameters) }.should change(User,:count).by(1) 
lambda { post("/api/users", parameters) }.should_not change(ActionMailer::Base, :deliveries) 

ma voglio farlo così:

lambda { post("/api/users", parameters) }.should change(User,:count).by(1).and_not change(ActionMailer::Base, :deliveries) 

E 'possibile farlo senza il bisogno di due chiamate?

Grazie

+0

stavo cercando questo me stesso – prusswan

risposta

11

Ho trovato una soluzione per testarlo.

lambda{ 
    lambda { post("/api/users", params) }.should change(User,:count).by(1) 
}.should change(ActionMailer::Base.deliveries, :count).by(1) 
2

Nel mio test sono molto severe: voglio che ciascuno prova per testare una sola cosa. Quindi sceglierei sempre la prima forma, non la seconda.

In secondo luogo, non sono sicuro che sia tecnicamente possibile. Lo .should prevede un blocco, che viene eseguito prima e dopo il lambda. Ad ogni modo, per quanto ne so io attualmente rspec non supporta questo (e imho a ragione).

+0

Ok, grazie per la risposta! –

0

Recentemente ho sono imbattuto in questo problema durante la migrazione di alcune request test verso feature formato di prova per Capybara 2.1, e il passaggio alla sintassi di test non ci da should -based a expect based. Per utilizzare la domanda originale come l'esempio, ho avuto il codice come:

subject { -> { post("/api/users", parameters) } } 
it { should change(User,:count).by(1) } 
it { should_not change(ActionMailer::Base, :deliveries) } 

Portare questo oltre a expect sintassi in un test scenario presentato alcuni problemi e ha prodotto questo tipo di (lavorare) clunkiness (mi dispiace, non è un grande fan di esplicitamente nidificato lambda s/expect e) chiave:

expect(-> { expect(post("/api/users", parameters)).to change(User,:count).by(1) } 
).to_not change(ActionMailer::Base, :deliveries) 

ci sono alcuni grandi soluzioni a questo problema in this StackOverflow thread che ho provato ed è riuscito con, ma quello che ho finito per fare era semplicemente seguire il formato originale un po 'e dividere fuori ogni dichiarazione nel proprio scenario; qualcosa di simile:

feature "Add users via API" do 
    given(:posting_parameters_to_api) { -> { post("/api/users", parameters) } } 

    scenario "foo" do 
    expect(posting_parameters_to_api).to change(User,:count).by(1) 
    end 

    scenario "bar" do 
    expect(posting_parameters_to_api).to_not change(ActionMailer::Base, 
                :deliveries) 
    end 
end 

più dettagliato rispetto al request specifiche originali, ma essenzialmente a lavorare nello stesso modo. L'implementazione sarà probabilmente dovuta al gusto personale.

Problemi correlati