Pruebas unitarias de aplicaciones de SignalR
por Patrick Fletcher
Advertencia
Esta documentación no se aplica a la última versión de SignalR. Eche un vistazo a SignalR de ASP.NET Core.
En este artículo se describe el uso de las características de prueba unitaria de SignalR 2.
Versiones de software empleadas en este tema
- Visual Studio 2013
- .NET 4.5
- SignalR, versión 2
Preguntas y comentarios
Deje sus comentarios sobre este tutorial y sobre lo que podríamos mejorar en los comentarios en la parte inferior de la página. Si tiene alguna pregunta que no esté directamente relacionadas con el tutorial, puede publicarla en el foro de ASP.NET SignalR o en StackOverflow.com.
Pruebas unitarias en aplicaciones SignalR
Puede usar las características de prueba unitaria de SignalR 2 para crear pruebas unitarias para la aplicación SignalR. SignalR 2 incluye la interfaz IHubCallerConnectionContext, que se puede usar para crear un objeto ficticio para simular los métodos del centro para realizar pruebas.
En esta sección, agregará pruebas unitarias para la aplicación creada en el tutorial de introducción mediante XUnit.net y Moq.
XUnit.net se usará para controlar la prueba; Moq se usará para crear un objeto ficticio para las pruebas. Si lo desea, se pueden usar otros marcos ficticios; NSubstitute también es una buena opción. En este tutorial se muestra cómo configurar el objeto ficticio de dos maneras: en primer lugar, mediante un objeto dynamic
(introducido en .NET Framework 4) y en segundo lugar, mediante una interfaz.
Contenido
Este tutorial contiene las siguientes secciones:
Prueba unitaria con objetos dinámicos
En esta sección, agregará una prueba unitaria para la aplicación creada en el tutorial de introducción mediante un objeto dinámico.
Instalación de la extensión de XUnit Runner para Visual Studio 2013
Complete el tutorial de introducción o descargue la aplicación completada desde la galería de códigos de MSDN.
Si usa la versión de descarga de la aplicación de introducción, abra la consola del administrador de paquetes y haga clic en Restaurar para agregar el paquete SignalR al proyecto.
Agregue un proyecto a la solución para la prueba unitaria. Haga clic con el botón derecho en el Explorador de soluciones y seleccione Agregar, Nuevo elemento... En el nodo C#, seleccione el nodo Windows. Seleccione Biblioteca de clases de . Asigne al nuevo proyecto el nombre TestLibrary y seleccione Crear.
Agregue una referencia en el proyecto de biblioteca de pruebas al proyecto SignalRChat. Haga clic con el botón derecho en el proyecto TestLibrary y seleccione Agregar, Referencia.... Seleccione el nodo Proyectos en el nodo Solución y active SignalRChat. Haga clic en OK.
Agregue los paquetes SignalR, Moq y XUnit al proyecto TestLibrary. En la consola del administrador de paquetes, establezca la lista desplegable Proyecto predeterminado en TestLibrary. Ejecute los siguientes comandos en el directorio del proyecto:
Install-Package Microsoft.AspNet.SignalR
Install-Package Moq
Install-Package XUnit
Cree el archivo de prueba. Haga clic con el botón derecho en el proyecto TestLibrary y haga clic en Agregar..., Clase. Asigne un nombre a la nueva clase Tests.cs.
Reemplace el contenido de Tests.cs por el código siguiente.
using System; using Xunit; using SignalRChat; using Microsoft.AspNet.SignalR.Hubs; using Moq; using System.Dynamic; namespace TestLibrary { public class Tests { [Fact] public void HubsAreMockableViaDynamic() { bool sendCalled = false; var hub = new ChatHub(); var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>(); hub.Clients = mockClients.Object; dynamic all = new ExpandoObject(); all.broadcastMessage = new Action<string, string>((name, message) => { sendCalled = true; }); mockClients.Setup(m => m.All).Returns((ExpandoObject)all); hub.Send("TestUser", "TestMessage"); Assert.True(sendCalled); } } }
En el código anterior, se crea un cliente de prueba mediante el objeto
Mock
de la biblioteca Moq, de tipo IHubCallerConnectionContext (en SignalR 2.1, asignardynamic
para el parámetro de tipo). La interfazIHubCallerConnectionContext
es el objeto proxy con el que se invocan métodos en el cliente. A continuación, la funciónbroadcastMessage
se define para el cliente ficticio para que la claseChatHub
pueda llamarla. Después, el motor de pruebas llama al métodoSend
de la claseChatHub
, que a su vez llama a la función ficticiabroadcastMessage
.Presione F6 para compilar la solución.
Ejecute la prueba unitaria. En Visual Studio, seleccione Probar, Windows, Explorador de pruebas. En la ventana Explorador de pruebas, haga clic con el botón derecho en HubsAreMockableViaDynamic y seleccione Ejecutar pruebas seleccionadas.
Compruebe que la prueba superada comprobando el panel inferior en la ventana Explorador de pruebas. La ventana mostrará que se ha superado la prueba.
Pruebas unitarias por tipo
En esta sección, agregará una prueba para la aplicación creada en el tutorial de introducción mediante una interfaz que contiene el método que se va a probar.
Complete los pasos del 1 al 7 del tutorial Pruebas unitarias con objetos dinámico anterior.
Reemplace el contenido de Tests.cs por el código siguiente.
using Xunit; using SignalRChat; using Microsoft.AspNet.SignalR.Hubs; using Moq; namespace TestLibrary { public class Tests { public interface IClientContract { void broadcastMessage(string name, string message); } [Fact] public void HubsAreMockableViaType() { var hub = new ChatHub(); var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>(); var all = new Mock<IClientContract>(); hub.Clients = mockClients.Object; all.Setup(m => m.broadcastMessage(It.IsAny<string>(), It.IsAny<string>())).Verifiable(); mockClients.Setup(m => m.All).Returns(all.Object); hub.Send("TestUser", "TestMessage"); all.VerifyAll(); } } }
En el código anterior, se crea una interfaz que define la firma del método para el método
broadcastMessage
que el motor de pruebas creará un cliente ficticio. Después, se crea un cliente ficticio mediante el objetoMock
, de tipo IHubCallerConnectionContext (en SignalR 2.1, asignedynamic
para el parámetro de tipo). La interfazIHubCallerConnectionContext
es el objeto proxy con el que se invocan métodos en el cliente.A continuación, la prueba crea una instancia de
ChatHub
y, a continuación, crea una versión ficticia del métodobroadcastMessage
, que a su vez se invoca llamando al métodoSend
en el centro de conectividad.Presione F6 para compilar la solución.
Ejecute la prueba unitaria. En Visual Studio, seleccione Probar, Windows, Explorador de pruebas. En la ventana Explorador de pruebas, haga clic con el botón derecho en HubsAreMockableViaDynamic y seleccione Ejecutar pruebas seleccionadas.
Compruebe que la prueba superada comprobando el panel inferior en la ventana Explorador de pruebas. La ventana mostrará que se ha superado la prueba.