对 SignalR 应用程序进行单元测试
警告
本文档不适用于最新版本的 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 中为类型参数分配 的 IHubCallerConnectionConnectionContext ()创建dynamic
测试客户端。) 接口IHubCallerConnectionContext
是用于在客户端上调用方法的代理对象。 然后,为broadcastMessage
mock 客户端定义函数,以便类可以调用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 (类型对象创建dynamic
模拟客户端。) 接口IHubCallerConnectionContext
是用于在客户端上调用方法的代理对象。然后,测试会创建 的
ChatHub
实例,然后创建 方法的broadcastMessage
模拟版本,后者又通过在中心上调用Send
方法调用。按 F6 生成解决方案。
运行单元测试。 在 Visual Studio 中,依次选择“测试”、“Windows”、“测试资源管理器”。 在“测试资源管理器”窗口中,右键单击“ HubsAreMockableViaDynamic ”,然后选择“ 运行所选测试”。
通过检查“测试资源管理器”窗口中的下部窗格来验证测试是否通过。 窗口将显示测试已通过。