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

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.

  1. Instalación de la extensión de XUnit Runner para Visual Studio 2013

  2. Complete el tutorial de introducción o descargue la aplicación completada desde la galería de códigos de MSDN.

  3. 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.

    Restore Packages

  4. 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.

    Create Test Library

  5. 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.

    Add Project Reference

  6. 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

      Install Packages

  7. 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.

  8. 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, asignar dynamic para el parámetro de tipo). La interfaz IHubCallerConnectionContext es el objeto proxy con el que se invocan métodos en el cliente. A continuación, la función broadcastMessage se define para el cliente ficticio para que la clase ChatHub pueda llamarla. Después, el motor de pruebas llama al método Send de la clase ChatHub, que a su vez llama a la función ficticia broadcastMessage.

  9. Presione F6 para compilar la solución.

  10. 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.

    Screenshot showing HubsAreMockableViaDynamic selected in the Test Explorer window.

  11. Compruebe que la prueba superada comprobando el panel inferior en la ventana Explorador de pruebas. La ventana mostrará que se ha superado la prueba.

    Screenshot showing the unit test using a dynamic object has passed.

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.

  1. Complete los pasos del 1 al 7 del tutorial Pruebas unitarias con objetos dinámico anterior.

  2. 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 objeto Mock, de tipo IHubCallerConnectionContext (en SignalR 2.1, asigne dynamic para el parámetro de tipo). La interfaz IHubCallerConnectionContext 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étodo broadcastMessage, que a su vez se invoca llamando al método Send en el centro de conectividad.

  3. Presione F6 para compilar la solución.

  4. 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.

    Screenshot showing HubsAreMockableViaType selected in the Test Explorer window.

  5. Compruebe que la prueba superada comprobando el panel inferior en la ventana Explorador de pruebas. La ventana mostrará que se ha superado la prueba.

    Screenshot showing the unit test by type has passed.