Estoy comenzando un nuevo proyecto (bueno, reiniciando uno existente) y tratando de adoptar TDD (por enésima vez) para todos los beneficios que debería traer.TDD'ing Controladores MVC para controlar el diseño
Creo que TDD hará que mis pruebas me obliguen a escribir solo el código que necesito escribir, pero me llevará a escribir el código que NECESITO y no a dejarlo.
Aquí es donde mi actual estado de incertidumbre viene en
cuenta la historia:.
"Un usuario debe ser capaz de añadir un widget, haciendo así que se toman para ver los detalles de la nueva widget agregado ".
OK, así que trabajando desde la interfaz de usuario (ya que es allí donde un usuario agregará su widget, y no usando Visual Studio y un conjunto de ensambles que escribo) ... comienzo con la siguiente prueba, escribiendo el mínimo para que la prueba pase.
Así que comencé con el controlador lanzando una NotImplementedException, y luego devolviendo una vista() ... el siguiente fue el primer punto que escribí la menor cantidad de líneas que pude para pasar la prueba.
[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");
}
}
Ahora me doy cuenta de que las pruebas adicionales para los modelos no válidos y la comprobación del estado del modelo evolucionarán a partir de historias adicionales.
Sin embargo, no veo una forma clara de cómo aprovechar las pruebas adicionales para obtener más código dentro del controlador.
Por ejemplo, sé que en algún momento desearé hacer una llamada a WidgetService desde la acción Crear. ¿Me estoy perdiendo algo obvio (no ser capaz de ver la madera para los árboles?) ¿Cómo puedo progresar el código del controlador con pruebas adicionales?
Hablando del WidgetService, espero que escriba un WidgetServiceTester y por el momento será muy probable que se burlen las referencias dentro del controlador.
Algunos pensamientos que he tenido ...
- Crear una nueva prueba llamada Create_IfModelIsValid_WidgetIsAddedToRepository, pero ¿cómo afecta esto conduce claramente a las llamadas de servicio en la acción del controlador?
- Tengo que escribir una historia más detallada que indique que el modelo debe insertarse en el repositorio/base de datos, etc.
- ¿Estoy confundiendo elementos de TDD y XP?
Gracias por leer, agradecería cualquier comentario e ideas sobre las mejores prácticas para progresar.
Joe.
EDITAR 27 de Feb 2010
me encontré con el siguiente artículo iteración # 6 - Uso Test-Driven Development (en asp.net) (http://www.asp.net/%28S%28ywiyuluxr3qb2dfva1z5lgeg%29%29/learn/mvc/tutorial-31-cs.aspx) que demuestra el tipo de cosa que fue después, sin embargo, parecen considerar la adición de repositorio/servicio al controlador como factorización ... personalmente no estoy de acuerdo, ¿me equivoco?:)
Voy a pensar en escribir una prueba que verifique la acción ViewData of the Details y actualice esta pregunta una vez que lo haya hecho.