對 SignalR 應用程式進行單元測試
作者: Patrick Fletcher
警告
本檔不適用於最新版的 SignalR。 請查看ASP.NET Core SignalR。
本文說明如何使用 SignalR 2 的單元測試功能。
本主題中使用的軟體版本
- Visual Studio 2013
- .NET 4.5
- SignalR 第 2 版
問題和批註
請留下您喜歡本教學課程的意見反應,以及我們可以在頁面底部的批註中改善的內容。 如果您有與教學課程不直接相關的問題,您可以將問題張貼到 ASP.NET SignalR 論壇 或 StackOverflow.com。
單元測試 SignalR 應用程式
您可以使用 SignalR 2 中的單元測試功能,為 SignalR 應用程式建立單元測試。 SignalR 2 包含 IHubCallerConnectionCoNtext 介面,可用來建立模擬物件來模擬中樞方法進行測試。
在本節中,您將使用XUnit.net和Moq,為消費者入門教學課程中建立的應用程式新增單元測試。
XUnit.net 將用來控制測試;Moq 將用來建立用於測試的 模擬 物件。 如有需要,可以使用其他模擬架構; NSubstitute 也是不錯的選擇。 本教學課程示範如何以兩種方式設定模擬物件:首先,使用 dynamic
.NET Framework 4) 中引進的物件 (,第二種是使用 介面。
目錄
本教學課程包含下列各節。
使用 Dynamic 進行單元測試
在本節中,您將使用動態物件,為消費者入門教學課程中建立的應用程式新增單元測試。
安裝適用于 Visual Studio 2013 的XUnit 執行器擴充功能。
如果您使用消費者入門應用程式的下載版本,請開啟[套件管理員主控台],然後按一下 [還原] 將 SignalR 套件新增至專案。
將專案新增至單元測試的解決方案。 在[方案總管] 中以滑鼠右鍵按一下您的方案,然後選取 [新增]、[新增專案...]。在C#節點下,選取[Windows] 節點。 選取 [類別庫]。 將新專案命名為 TestLibrary ,然後按一下 [ 確定]。
將測試程式庫專案中的參考新增至 SignalRChat 專案。 以滑鼠右鍵按一下TestLibrary專案,然後選取 [新增]、[參考...]。選取[方案] 節點底下的 [專案] 節點,然後核取[SignalRChat]。 按一下 [確定]。
將 SignalR、Moq 和 XUnit 套件新增至 TestLibrary 專案。 在 [套件管理員主控台]中,將 [預設專案 ] 下拉式清單設定為 TestLibrary。 在主控台視窗中執行下列命令:
Install-Package Microsoft.AspNet.SignalR
Install-Package Moq
Install-Package XUnit
建立測試檔案。 以滑鼠右鍵按一下 TestLibrary 專案,然後按一下 [ 新增...]、 [類別]。 將新的類別命名為 Tests.cs。
以下列程式碼取代 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); } } }
在上述程式碼中,會使用
Mock
Moq 程式庫中的物件,在 SignalR 2.1 中,使用 IHubCallerConnectionCoNtext (類型的物件來建立測試用戶端。dynamic
) 介面IHubCallerConnectionContext
是您在用戶端上叫用方法的 Proxy 物件。broadcastMessage
接著會為模擬用戶端定義函式,讓類別可以呼叫ChatHub
該函式。 測試引擎接著會呼叫Send
類別的ChatHub
方法,接著會呼叫模擬函broadcastMessage
式。按 F6建置方案。
執行單元測試。 在 Visual Studio 中,選取 [ 測試]、 [Windows]、[ 測試總管]。 在 [測試總管] 視窗中,以滑鼠右鍵按一下 [ HubsAreMockableViaDynamic ],然後選取 [ 執行選取的測試]。
檢查 [測試總管] 視窗中的下方窗格,以確認通過的測試。 視窗會顯示測試通過。
依類型進行單元測試
在本節中,您將使用包含要測試之方法的介面,為消費者入門教學課程中建立的應用程式新增測試。
使用上述 動態教學課程完成單元測試 中的步驟 1-7。
以下列程式碼取代 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
用。按 F6建置方案。
執行單元測試。 在 Visual Studio 中,選取 [ 測試]、 [Windows]、[ 測試總管]。 在 [測試總管] 視窗中,以滑鼠右鍵按一下 [ HubsAreMockableViaDynamic ],然後選取 [ 執行選取的測試]。
檢查 [測試總管] 視窗中的下方窗格,以確認通過的測試。 視窗會顯示測試通過。