BDD / TDD con JSpec - codice di rimozione di duplicazione
-
28-09-2019 - |
Domanda
Come faccio a refactoring per rimuovere la duplicazione del codice in questa spec:
describe 'TestPlugins'
describe '.MovieScanner(document)'
before_each
MoviePage_loggedIn = fixture("movie_logged_in.html") // Get logged-in movie page
MoviePage_notloggedIn = fixture("movie_not_logged_in.html") // Get non logged-in movie page
scanner = new MovieScanner() // Get movie scanner
end
it 'should scan logged-in movie page for movie data'
doc = MoviePage_loggedIn // Get document to scan
// Unit Tests
// ------------------------------------------------------------
// Test movie scanner's functions
scanner.getMovieTitle(doc).should.eql "The Jacket"
scanner.getMovieYear(doc).should.eql "2005"
// Test movie scanner's main scan function
scannedData = scanner.scan(doc)
scannedData.title.should.eql "The Jacket"
scannedData.year.should.eql "2005"
end
it 'should scan non logged-in movie page for movie data'
doc = MoviePage_notloggedIn // Get document to scan
// Unit Tests
// ------------------------------------------------------------
// Test movie scanner's functions
scanner.getMovieTitle(doc).should.eql "The Jacket"
scanner.getMovieYear(doc).should.eql "2005"
// Test movie scanner's main scan function
scannedData = scanner.scan(doc)
scannedData.title.should.eql "The Jacket"
scannedData.year.should.eql "2005"
end
end
end
Soluzione
In BDD, vogliamo descrivere il comportamento della nostra applicazione o le classi per renderli facile da cambiare. Se la rimozione duplicazione sarebbe anche oscurare il comportamento, non rimuovere la duplicazione. Il codice viene letto 10 volte più di quello che è scritto, e IME ancora di più per BDD scenari e gli esempi a livello di unità.
Se si decide di rimuovere la duplicazione in ogni caso, sostituirlo con qualcosa di leggibile. Io non sono a conoscenza JSpec ma mi aspetto qualcosa di simile
scannedData.shouldMatch "The Jacket", "2005"
dove vengono controllati tutti i risultati rilevanti per titolo e anno.
Per rimuovere la duplicazione irrilevante dal fatto che l'accesso o meno:
separare il codice in Givens (contesto in cui non importa come ci sei arrivato), Whens (eventi attraverso l'applicazione quale comportamento si vuole realmente test) e thens (risultati che stai cercando). Stai cercando di descrivere le capacità del sistema e le cose che un utente può fare con esso, piuttosto che si tratti di una pagina web o una finestra - non dovrebbe importare. Mettere le chiamate di livello inferiore a un livello inferiore.
Si può quindi avere due diverse Givens - collegato o non connesso -. E riutilizzare le altre fasi per il resto