Volevo insegnarmi come usare l'approccio TDD e avevo un progetto su cui volevo lavorare da un po '. Non era un grande progetto, quindi ho pensato che sarebbe stato un buon candidato per TDD. Tuttavia, sento che qualcosa è andato storto. Lasciami fare un esempio:
Ad alto livello il mio progetto è un componente aggiuntivo per Microsoft OneNote che mi permetterà di tracciare e gestire i progetti più facilmente. Ora, volevo anche mantenere la logica di business per questo il più possibile disaccoppiata da OneNote nel caso in cui avessi deciso di creare il mio spazio di archiviazione personalizzato e il back-end un giorno.
Per prima cosa ho iniziato con un test di accettazione di base in parole semplici per delineare ciò che volevo fare il mio primo film. Sembra qualcosa del genere (scioccandolo per brevità):
- I clic dell'utente creano il progetto
- Tipi di utenti nel titolo del progetto
- Verificare che il progetto sia stato creato correttamente
Saltando le cose dell'interfaccia utente e un po 'di pianificazione intermedia, arrivo al mio primo test unitario:
[TestMethod]
public void CreateProject_BasicParameters_ProjectIsValid()
{
var testController = new Controller();
Project newProject = testController(A.Dummy<String>());
Assert.IsNotNull(newProject);
}
Fin qui tutto bene. Rosso, verde, refattore, ecc. Bene, ora ha davvero bisogno di salvare roba. Ritagliando alcuni passaggi qui finisco con questo.
[TestMethod]
public void CreateProject_BasicParameters_ProjectMatchesExpected()
{
var fakeDataStore = A.Fake<IDataStore>();
var testController = new Controller(fakeDataStore);
String expectedTitle = fixture.Create<String>("Title");
Project newProject = testController(expectedTitle);
Assert.AreEqual(expectedTitle, newProject.Title);
}
Mi sento ancora bene a questo punto. Non ho ancora un archivio dati concreto, ma ho creato l'interfaccia come mi aspettavo.
Salto alcuni passaggi qui perché questo post sta diventando abbastanza lungo, ma ho seguito processi simili e alla fine arrivo a questo test per il mio archivio di dati:
[TestMethod]
public void SaveNewProject_BasicParameters_RequestsNewPage()
{
/* snip init code */
testDataStore.SaveNewProject(A.Dummy<IProject>());
A.CallTo(() => oneNoteInterop.SavePage()).MustHaveHappened();
}
Questo è andato bene fino a quando ho provato a implementarlo:
public String SaveNewProject(IProject project)
{
Page projectPage = oneNoteInterop.CreatePage(...);
}
E c'è il problema proprio dove si trova il "...". Adesso mi rendo conto che CreatePage richiede un ID sezione. Non me ne sono reso conto quando stavo pensando a livello di controller perché mi occupavo solo di testare i bit rilevanti per il controller. Tuttavia, fin qui mi rendo conto che devo chiedere all'utente una posizione in cui archiviare il progetto. Ora devo aggiungere un ID di posizione all'archivio dati, quindi aggiungerne uno al progetto, quindi aggiungerne uno al controller e aggiungerlo a TUTTI i test già scritti per tutte queste cose. È diventato noioso molto rapidamente e non posso fare a meno di pensare che l'avrei preso più rapidamente se avessi abbozzato il progetto in anticipo piuttosto che lasciarlo progettato durante il processo TDD.
Qualcuno può spiegarmi se ho fatto qualcosa di sbagliato in questo processo? Esiste comunque questo tipo di refactoring che può essere evitato? O è comune? Se è comune, ci sono modi per renderlo più indolore?
Ringrazia tutti!