對 SignalR 應用程式進行單元測試

作者: Patrick Fletcher

警告

本檔不適用於最新版的 SignalR。 請查看ASP.NET Core SignalR

本文說明如何使用 SignalR 2 的單元測試功能。

本主題中使用的軟體版本

問題和批註

請留下您喜歡本教學課程的意見反應,以及我們可以在頁面底部的批註中改善的內容。 如果您有與教學課程不直接相關的問題,您可以將問題張貼到 ASP.NET SignalR 論壇StackOverflow.com

單元測試 SignalR 應用程式

您可以使用 SignalR 2 中的單元測試功能,為 SignalR 應用程式建立單元測試。 SignalR 2 包含 IHubCallerConnectionCoNtext 介面,可用來建立模擬物件來模擬中樞方法進行測試。

在本節中,您將使用XUnit.netMoq,為消費者入門教學課程中建立的應用程式新增單元測試。

XUnit.net 將用來控制測試;Moq 將用來建立用於測試的 模擬 物件。 如有需要,可以使用其他模擬架構; NSubstitute 也是不錯的選擇。 本教學課程示範如何以兩種方式設定模擬物件:首先,使用 dynamic .NET Framework 4) 中引進的物件 (,第二種是使用 介面。

目錄

本教學課程包含下列各節。

使用 Dynamic 進行單元測試

在本節中,您將使用動態物件,為消費者入門教學課程中建立的應用程式新增單元測試。

  1. 安裝適用于 Visual Studio 2013 的XUnit 執行器擴充功能

  2. 完成消費者入門教學課程,或從MSDN 程式碼庫下載已完成的應用程式。

  3. 如果您使用消費者入門應用程式的下載版本,請開啟[套件管理員主控台],然後按一下 [還原] 將 SignalR 套件新增至專案。

    還原套件

  4. 將專案新增至單元測試的解決方案。 在[方案總管] 中以滑鼠右鍵按一下您的方案,然後選取 [新增]、[新增專案...]。在C#節點下,選取[Windows] 節點。 選取 [類別庫]。 將新專案命名為 TestLibrary ,然後按一下 [ 確定]。

    建立測試程式庫

  5. 將測試程式庫專案中的參考新增至 SignalRChat 專案。 以滑鼠右鍵按一下TestLibrary專案,然後選取 [新增]、[參考...]。選取[方案] 節點底下的 [專案] 節點,然後核取[SignalRChat]。 按一下 [確定]。

    新增專案參考

  6. 將 SignalR、Moq 和 XUnit 套件新增至 TestLibrary 專案。 在 [套件管理員主控台]中,將 [預設專案 ] 下拉式清單設定為 TestLibrary。 在主控台視窗中執行下列命令:

    • Install-Package Microsoft.AspNet.SignalR

    • Install-Package Moq

    • Install-Package XUnit

      安裝套件

  7. 建立測試檔案。 以滑鼠右鍵按一下 TestLibrary 專案,然後按一下 [ 新增...]、 [類別]。 將新的類別命名為 Tests.cs

  8. 以下列程式碼取代 Tests.cs 的內容。

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

    在上述程式碼中,會使用 MockMoq 程式庫中的物件,在 SignalR 2.1 中,使用 IHubCallerConnectionCoNtext (類型的物件來建立測試用戶端。 dynamic ) 介面 IHubCallerConnectionContext 是您在用戶端上叫用方法的 Proxy 物件。 broadcastMessage接著會為模擬用戶端定義函式,讓類別可以呼叫 ChatHub 該函式。 測試引擎接著會呼叫 Send 類別的 ChatHub 方法,接著會呼叫模擬函 broadcastMessage 式。

  9. F6建置方案。

  10. 執行單元測試。 在 Visual Studio 中,選取 [ 測試]、 [Windows]、[ 測試總管]。 在 [測試總管] 視窗中,以滑鼠右鍵按一下 [ HubsAreMockableViaDynamic ],然後選取 [ 執行選取的測試]。

    顯示 [測試總管] 視窗中已選取 HubsAreMockableViaDynamic 的螢幕擷取畫面。

  11. 檢查 [測試總管] 視窗中的下方窗格,以確認通過的測試。 視窗會顯示測試通過。

    顯示已通過動態物件之單元測試的螢幕擷取畫面。

依類型進行單元測試

在本節中,您將使用包含要測試之方法的介面,為消費者入門教學課程中建立的應用程式新增測試。

  1. 使用上述 動態教學課程完成單元測試 中的步驟 1-7。

  2. 以下列程式碼取代 Tests.cs 的內容。

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

    在上述程式碼中,會建立介面來定義測試引擎將建立模擬用戶端的方法簽章 broadcastMessage 。 模擬用戶端接著會使用 Mock SignalR 2.1 中 IHubCallerConnectionCoNtext 類型為 IHubCallerConnectionCoNtext (的物件來建立。 dynamic ) 介面 IHubCallerConnectionContext 是您在用戶端上叫用方法的 Proxy 物件。

    測試接著會建立 的 ChatHub 實例,然後建立方法的 broadcastMessage 模擬版本,接著會藉由在中樞上呼叫 方法來叫 Send 用。

  3. F6建置方案。

  4. 執行單元測試。 在 Visual Studio 中,選取 [ 測試]、 [Windows]、[ 測試總管]。 在 [測試總管] 視窗中,以滑鼠右鍵按一下 [ HubsAreMockableViaDynamic ],然後選取 [ 執行選取的測試]。

    顯示 [測試總管] 視窗中已選取 HubsAreMockableViaType 的螢幕擷取畫面。

  5. 檢查 [測試總管] 視窗中的下方窗格,以確認通過的測試。 視窗會顯示測試通過。

    顯示已通過類型單元測試的螢幕擷取畫面。