Sto iniziando su un nuovo progetto (beh, riavvio di uno esistente) e sto tentando di adottare TDD (per l'ennesima volta) per tutti i vantaggi che dovrebbe comportare.TDD'ing MVC Controller per la progettazione dell'azionamento
Credo che il TDD comporterà i miei test guidandomi a scrivere solo il codice che ho bisogno di scrivere, ma mi guiderà a scrivere il codice che HO BISOGNO e non ne lascerò fuori.
Questo è dove il mio attuale stato di incertezza viene in
consideri la storia:.
"un utente deve essere in grado di aggiungere un widget, facendo in modo che siano adottate per visualizzare i dettagli della nuova aggiunto widget. "
OK, quindi funziona dall'interfaccia utente (poiché è lì che un utente aggiungerà il proprio widget e non utilizzando Visual Studio e un insieme di assiemi che scrivo) ... Inizio con il seguente test, scrivendo il minimo in modo che il test passi.
Così ho iniziato con il controller lanciare NotImplementedException, quindi restituire una vista() ... il seguente è stato il primo punto in cui avevo scritto il minor numero di linee che potevo fare per passare il test.
[TestFixture]
public class WidgetControllerTester
{
[Test]
public void Create_IfBusinessModelIsValid_ReturnRedirectToRouteResultToDetailsAction()
{
// Arrange
var currentUser = new User
{
DisplayName = "Fred",
Email = "[email protected]",
Password = "pass",
Status = UserStatus.Active
};
var model = new WidgetModel();
var controller = new WidgetController();
// Act
var actionResult = controller.Create(currentUser, model);
// Assert
actionResult.AssertActionRedirect().ToAction("Details");
}
}
public class WidgetModel
{
}
public class WidgetController: Controller
{
public ActionResult Create()
{
return View("Create");
}
[HttpPost]
public ActionResult Create(User currentUser, Widget model)
{
return RedirectToAction("Details");
}
}
Ora mi rendo conto che ulteriori test per i modelli validi e la verifica dello stato di modello si evolveranno da storie aggiuntive.
Tuttavia, non riesco a vedere un percorso chiaro su come sfruttare i test aggiuntivi per guidare ulteriore codice all'interno del controller.
Ad esempio, so che a un certo punto desidero effettuare una chiamata WidgetService dall'azione Create. Mi manca qualcosa di ovvio (non potendo vedere il legno per gli alberi come materiale) come posso progredire il codice del controller con test aggiuntivi?
Parlando di WidgetService, mi aspetto che scriverò un WidgetServiceTester e per il momento i riferimenti all'interno del controller saranno probabilmente presi in giro.
Alcuni pensieri che ho avuto ...
- Creare un nuovo test chiamato Create_IfModelIsValid_WidgetIsAddedToRepository, ma come fa questo chiaramente conduce su chiamate di servizio nella azione di controllo?
- Ho bisogno di scrivere una storia più dettagliata affermando che il modello deve essere inserito nel repository/database, ecc.?
- Sto confondendo elementi di TDD e XP?
Grazie per la lettura, gradirei qualsiasi feedback e approfondimenti sulle migliori pratiche per il progresso.
Joe.
EDIT 27 Feb 2010
ho trovato il seguente articolo Iterazione # 6 - Usare Test-Driven Development (su asp.net) (http://www.asp.net/%28S%28ywiyuluxr3qb2dfva1z5lgeg%29%29/learn/mvc/tutorial-31-cs.aspx) che dimostra il genere di cosa che cercavo, ma che sembrano considerare l'aggiunta di repository/servizio al controller come ri-factoring ... Personalmente non sono d'accordo, mi sbaglio?:)
Ho intenzione di pensare a scrivere un test che controlla i ViewData dell'azione Dettagli e aggiornare questa domanda una volta che ho.