Freigeben über


Komponententests für SignalR-Anwendungen

von Patrick Fletcher

Warnung

Diese Dokumentation gilt nicht für die neueste Version von SignalR. Sehen Sie sich ASP.NET Core SignalR an.

In diesem Artikel wird die Verwendung der Komponententestfunktionen von SignalR 2 beschrieben.

In diesem Thema verwendete Softwareversionen

Fragen und Kommentare

Bitte hinterlassen Sie Feedback dazu, wie Ihnen dieses Tutorial gefallen hat und was wir in den Kommentaren unten auf der Seite verbessern könnten. Wenn Sie Fragen haben, die nicht direkt mit dem Tutorial zusammenhängen, können Sie diese im ASP.NET SignalR-Forum oder StackOverflow.com posten.

Komponententests für SignalR-Anwendungen

Sie können die Komponententestfeatures in SignalR 2 verwenden, um Komponententests für Ihre SignalR-Anwendung zu erstellen. SignalR 2 enthält die IHubCallerConnectionContext-Schnittstelle , die verwendet werden kann, um ein Mockobjekt zu erstellen, um Ihre Hubmethoden für Tests zu simulieren.

In diesem Abschnitt fügen Sie Komponententests für die Anwendung hinzu, die im Erste Schritte-Tutorial mit XUnit.net und Moq erstellt wurde.

XUnit.net wird verwendet, um den Test zu steuern; Moq wird verwendet, um ein Mockobjekt zum Testen zu erstellen. Bei Bedarf können andere Mocking-Frameworks verwendet werden. NSubstitute ist auch eine gute Wahl. In diesem Tutorial wird veranschaulicht, wie Sie das Mockobjekt auf zwei Arten einrichten: Erstens mithilfe eines dynamic Objekts (eingeführt in .NET Framework 4) und zweitens mithilfe einer Schnittstelle.

Inhalte

Dieses Tutorial enthält die folgenden Abschnitte.

Komponententests mit Dynamic

In diesem Abschnitt fügen Sie einen Komponententest für die Anwendung hinzu, die im Erste Schritte Tutorial mit einem dynamischen Objekt erstellt wurde.

  1. Installieren Sie die XUnit Runner-Erweiterung für Visual Studio 2013.

  2. Führen Sie entweder das tutorial Erste Schritte aus, oder laden Sie die vollständige Anwendung aus der MSDN Code Gallery herunter.

  3. Wenn Sie die Downloadversion der Erste Schritte Anwendung verwenden, öffnen Sie die Paket-Manager-Konsole, und klicken Sie auf Wiederherstellen, um das SignalR-Paket dem Projekt hinzuzufügen.

    Pakete wiederherstellen

  4. Fügen Sie der Projektmappe für den Komponententest ein Projekt hinzu. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf Ihre Projektmappe, und wählen Sie Hinzufügen, Neues Projekt... aus. Wählen Sie unter dem Knoten C# den Knoten Windows aus. Wählen Sie Klassenbibliothek aus. Nennen Sie das neue Projekt TestLibrary , und klicken Sie auf OK.

    Erstellen einer Testbibliothek

  5. Fügen Sie dem SignalRChat-Projekt einen Verweis im Testbibliotheksprojekt hinzu. Klicken Sie mit der rechten Maustaste auf das Projekt TestLibrary, und wählen Sie Hinzufügen, Verweis... aus. Wählen Sie unter dem Knoten Projektmappe den Knoten Projekte aus, und aktivieren Sie SignalRChat. Klicken Sie auf OK.

    Hinzufügen eines Projektverweises

  6. Fügen Sie dem TestLibrary-Projekt die Pakete SignalR, Moq und XUnit hinzu. Legen Sie in der Paket-Manager-Konsole die Dropdownliste Standardprojekt auf TestLibrary fest. Führen Sie die folgenden Befehle im Konsolenfenster aus:

    • Install-Package Microsoft.AspNet.SignalR

    • Install-Package Moq

    • Install-Package XUnit

      Pakete installieren

  7. Erstellen Sie die Testdatei. Klicken Sie mit der rechten Maustaste auf das Projekt TestLibrary , und klicken Sie auf Hinzufügen..., Klasse. Nennen Sie die neue Klasse Tests.cs.

  8. Ersetzen Sie den Inhalt von Tests.cs durch den folgenden Code.

    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);
            }
        }
    }
    

    Im obigen Code wird ein Testclient mit dem Mock Objekt aus der Moq-Bibliothek vom Typ IHubCallerConnectionContext erstellt (in SignalR 2.1 für den Typparameter zuweisen dynamic .) Die IHubCallerConnectionContext Schnittstelle ist das Proxyobjekt, mit dem Sie Methoden auf dem Client aufrufen. Die broadcastMessage Funktion wird dann für den Mockclient definiert, sodass sie von der ChatHub -Klasse aufgerufen werden kann. Die Test-Engine ruft dann die Send -Methode der ChatHub -Klasse auf, die wiederum die simulierte Funktion aufruft broadcastMessage .

  9. Erstellen Sie die Lösung, indem Sie F6 drücken.

  10. Führen Sie den Komponententest aus. Wählen Sie in Visual Studio Test, Windows, Test Explorer aus. Klicken Sie im Fenster Test Explorer mit der rechten Maustaste auf HubsAreMockableViaDynamic, und wählen Sie Ausgewählte Tests ausführen aus.

    Screenshot: Ausgewählte HubsAreMockableViaDynamic im Fenster Explorer testen

  11. Überprüfen Sie, ob der Test bestanden wurde, indem Sie den unteren Bereich im Fenster Test Explorer überprüfen. Im Fenster wird angezeigt, dass der Test bestanden wurde.

    Screenshot: Komponententest mit einem dynamischen Objekt wurde bestanden.

Komponententests nach Typ

In diesem Abschnitt fügen Sie einen Test für die Anwendung hinzu, die im Tutorial Erste Schritte erstellt wurde, indem Sie eine Schnittstelle verwenden, die die zu testende Methode enthält.

  1. Führen Sie die Schritte 1 bis 7 im obigen Tutorial Komponententests mit dynamischer Dynamik aus.

  2. Ersetzen Sie den Inhalt von Tests.cs durch den folgenden Code.

    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();
           }
        }
    }
    

    Im obigen Code wird eine Schnittstelle erstellt, die die Signatur der broadcastMessage Methode definiert, für die die Test-Engine einen Mockclient erstellt. Anschließend wird ein Mockclient mit dem Mock -Objekt vom Typ IHubCallerConnectionContext erstellt (in SignalR 2.1 für den Typparameter zuweisen dynamic ).) Die IHubCallerConnectionContext Schnittstelle ist das Proxyobjekt, mit dem Sie Methoden auf dem Client aufrufen.

    Der Test erstellt dann eine instance von und ChatHuberstellt dann eine Mockversion der broadcastMessage Methode, die wiederum durch Aufrufen der Send -Methode auf dem Hub aufgerufen wird.

  3. Erstellen Sie die Lösung, indem Sie F6 drücken.

  4. Führen Sie den Komponententest aus. Wählen Sie in Visual Studio Test, Windows, Test Explorer aus. Klicken Sie im Fenster Test Explorer mit der rechten Maustaste auf HubsAreMockableViaDynamic, und wählen Sie Ausgewählte Tests ausführen aus.

    Screenshot: Auswahl von HubsAreMockableViaType im Fenster Test Explorer

  5. Überprüfen Sie, ob der Test bestanden wurde, indem Sie den unteren Bereich im Fenster Test Explorer überprüfen. Im Fenster wird angezeigt, dass der Test bestanden wurde.

    Screenshot: Komponententest nach Typ ist bestanden.