En el artículo anterior de la serie de NancyFx hablábamos de diferentes tipos de respuesta así como el uso de plantillas en la plataforma. En este artículo veremos cómo crear pruebas unitarias para asegurarnos que nuestros módulos funcionan correctamente.
Creando nuestro primer test
Desde la documentación de Nancy se recomienda usar un proyecto diferente (es decir, un ensamblado diferente) para nuestros tests, ya que los módulos se descubren de manera automática por el «bootstrapper». Una vez creado nuestro proyecto, necesitamos agregar las siguientes referencias, via nuget o de manera manual:
- NUnit (o XUnit, o el framework que deseemos)
- Nancy
- Nancy.Testing
Una vez tenemos las referencias, podemos crear nuestro primer test (que tiene el original nombre de RoutesTest.cs). Dicho test estará dividido en tres partes:
- Arrange: Toda la preparación necesaria para poder llevar a cabo el test
- Act: La ejecución de nuestro test
- Assert: La fase de comprobación de los resultados
[Test ()] public void TestPut () { //Arrange var bootstrapper = new DefaultNancyBootstrapper(); var browser = new Browser(bootstrapper); //Act var result = browser.Put("/routes", with => { with.HttpRequest(); }); //Assert Assert.AreEqual (HttpStatusCode.OK, result.StatusCode); Assert.AreEqual ("Response with Put\n", result.Body.AsString()); }
Qué hace el test?
- Arrange: Para este test el primer paso es crear nuestro Bootstrapper que descubrirá los módulos existentes, seguido de un Browser con el que simularemos las llamadas a nuestros módulos.
-
Act: Una vez tenemos el browser, el siguiente paso es generar la peticion, en este caso Put, a una ruta especificada.
-
Assert: Con el resultado de la ejecución, comprobamos el estado de la respuesta (en este caso 200 OK) y que el texto corresponda con lo que necesitamos, que es «Response with Put\n».
Una vez tenemos las referencias, recordemos qué contenía el módulo que queríamos probar:
public class Routes : NancyModule { public Routes () { Get["/routes"] = _ => "Response with GET\n"; Post["/routes"] = _ => "Response with POST\n"; Put["/routes"] = _ => "Response with Put\n"; ... } }
Podemos identificar claramente una línea donde el verbo PUT devuelve «Response with Put\n», con lo cual nuestro test es correcto
Probando una ruta errónea
Al igual que podemos probar rutas correctas, los test son igual de válidos para comprobar que el acceso a una ruta no autorizada o no implementada se controla correctamente, como sucede a continuación:
[Test ()] public void TestNotFound () { //Arrange var bootstrapper = new DefaultNancyBootstrapper(); var browser = new Browser(bootstrapper); //Act var result = browser.Delete("/routes", with => { with.HttpRequest(); }); //Assert Assert.AreEqual (HttpStatusCode.MethodNotAllowed, result.StatusCode); }
En este caso, la ruta no está implementada, con lo cual el resultado será un error de tipo «Method Not Allowed».
Conclusiones
Con pocas líneas de código podemos comenzar a probar nuestros módulos de NancyFx, podemos probar la respuesta de los mismos, así como códigos de error. El sistema de test permite, adicionalmente, pasar parámetros (simulando el uso de un formulario) o navegar a través del DOM del HTML devuelto, si usamos un ViewEngine.
- Código completo en Github: https://github.com/rlbisbe/nancyfxfromsinatra/blob/master/NancyFxSinatraTests/RoutesTest.cs
- Más información: https://github.com/NancyFx/Nancy/wiki/Testing-your-application