RSpec: qual è la differenza tra una caratteristica e una specifica richiesta?


113

Qual è la differenza concettuale tra le specifiche delle funzionalità di Rspec e le specifiche della richiesta ?

Dai documenti delle specifiche della funzione:

Le specifiche delle funzionalità sono test di alto livello intesi a esercitare sezioni di funzionalità attraverso un'applicazione. Dovrebbero guidare l'applicazione solo tramite la sua interfaccia esterna, solitamente pagine web.

E per le specifiche della richiesta:

Le specifiche della richiesta forniscono un sottile involucro attorno ai test di integrazione di Rails e sono progettate per guidare il comportamento attraverso l'intero stack, incluso il routing (fornito da Rails) e senza stubbing (dipende da te). Con le specifiche della richiesta puoi:

  • specificare una singola richiesta
  • specificare più richieste su più controller
  • specificare più richieste su più sessioni

So che le specifiche delle funzionalità utilizzano Capybara e le specifiche della richiesta no. Ma questo difficilmente merita concetti diversi.

Risposte:


147

La differenza concettuale è che di solito stai testando una storia utente e tutte le interazioni dovrebbero essere guidate tramite l'interfaccia utente. È qui che entra in gioco Capybara. Una specifica di richiesta sta ancora testando il comportamento della tua applicazione e non ha l'aspettativa di leggibilità che avrebbe un test di accettazione. Quindi, la funzionalità è disponibile per la sintassi migliorata per i test di accettazione.

Le differenze tecniche includono le specifiche della richiesta che includono i test di integrazione di Rails, mentre le specifiche delle funzionalità no. Ciò significa che con le specifiche della richiesta puoi utilizzare i metodi get, post, put, delete e assert contro la risposta. Con le specifiche delle funzionalità dovresti guidare tutte le interazioni attraverso il browser e utilizzare metodi come visitare e affermare sulla pagina.

Consiglierei di leggere feature_spec.feature nel codice sorgente di rspec-rails su GitHub. Spero che aiuti.


2
Quindi consiglieresti di utilizzare sia le specifiche delle funzionalità che quelle della richiesta, o l'una o l'altra è sufficiente? (Essendo nuovo a TDD ...)
robertwbradford

2
Li uso entrambi, @robertwbradford. Uso le specifiche delle funzionalità per guidare il mio esterno nei test, testando l'esperienza dell'utente e quindi sviluppando la funzionalità utilizzando i test unitari. Uso le specifiche della richiesta per testare le risposte, ad esempio in una session_spec potrei avere un "GET /login"blocco di descrizione con aspettative in itblocchi come expect(response.status).to eq(200)e expect(response).to render_template(:new), o in describe "POST /sessions"un context "with valid credentials"blocco, con expect(response).to redirect_to(user)efollow_redirect!; expect(response.body).to include("Signed in")
Richard Jordan

5
E usi anche le specifiche del controller? Sembra che ci sia un po 'di duplicazione tra ciò che testate nelle specifiche della richiesta e ciò che viene normalmente testato nelle specifiche del controller.
Ernesto

5
Detto questo, il post sopra collegato descrive chiaramente le differenze. Usa le specifiche della richiesta per testare tramite API, usa le specifiche delle funzionalità per testare tramite frontend.
Damien Roche

2
@RichardJordan: Una domanda: nelle specifiche delle funzionalità, consiglieresti di utilizzare percorsi Rails (ie visit users_path) o stringhe hardcoded ( visit '/users') ?. Personalmente, preferisco non utilizzare gli interni dell'app in questo tipo di specifiche.
Tokland
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.