对 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 中为类型参数分配 的 IHubCallerConnectionConnectionContext ()创建 dynamic 测试客户端。) 接口 IHubCallerConnectionContext 是用于在客户端上调用方法的代理对象。 然后,为 broadcastMessage mock 客户端定义函数,以便类可以调用 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 (类型对象创建 dynamic 模拟客户端。) 接口 IHubCallerConnectionContext 是用于在客户端上调用方法的代理对象。

    然后,测试会创建 的 ChatHub实例,然后创建 方法的 broadcastMessage 模拟版本,后者又通过在中心上调用 Send 方法调用。

  3. F6 生成解决方案。

  4. 运行单元测试。 在 Visual Studio 中,依次选择“测试”、“Windows”、“测试资源管理器”。 在“测试资源管理器”窗口中,右键单击“ HubsAreMockableViaDynamic ”,然后选择“ 运行所选测试”。

    显示“测试资源管理器”窗口中选择了 HubsAreMockableViaType 的屏幕截图。

  5. 通过检查“测试资源管理器”窗口中的下部窗格来验证测试是否通过。 窗口将显示测试已通过。

    显示按类型通过的单元测试的屏幕截图。