【问题标题】:Ways to mock SignalR Clients.Group in unit test在单元测试中模拟 SignalR Clients.Group 的方法
【发布时间】:2017-05-25 14:09:42
【问题描述】:

我正在为 SignalR 应用程序编写模拟测试用例。我刚开始在Unit Testing SignalR Applications 的帮助下开始,但我的要求与那里显示的示例略有不同。 以下是我在谷歌搜索后完成的代码。

信号RHub

public class HubServer : Hub
{
    [HubMethodName("SendNofication")]
    public void GetNofication(string message)
    {
        try
        {
            Clients.Group("Manager").BroadCast(message);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }        
}

单元测试

public interface IClientContract { }

[TestMethod]
public void GetNoficationTest()
{
    var hub = new HubServer();
    var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
    hub.Clients = mockClients.Object;
    var all = new Mock<IClientContract>();
    string message = "Message to send";

    mockClients.Setup(m => m.Group("Manager")).Returns(message);
    mockClients.Setup(m => m.All).Returns(all.Object);

    hub.GetNofication("Mock call to SingalR hub");
    all.VerifyAll();
}

我是单元测试应用程序的初学者,只是想确认这是否是模拟 SignalR 组的正确方法。

【问题讨论】:

  • 您是否遇到任何错误或者这意味着要进行代码审查?
  • @Nkosi 没有错误,测试成功。只是为了代码审查来检查它是否是正确的模拟方式?如果不是,则需要您的帮助来纠正它。
  • 我测试了您上面的代码,但没有通过。我的回答是基于您的代码不起作用这一事实。
  • 在我的应用程序中使用上述代码成功通过测试。正如我告诉过你的,我是编写模拟测试用例的初学者,我只是想确认我这样做是否正确。
  • 我在这里也发布了另一个单元测试组的例子,以防有任何帮助:stackoverflow.com/a/46953636/1879019

标签: c# unit-testing signalr moq


【解决方案1】:

使用来自Microsoft.AspNet.SignalR.Tests的示例

Hubs Group 是可模拟的

客户合同需要使用必要的方法进行更新。在这种情况下,您必须添加 Broadcast 方法以匹配它在 Hub 中的调用方式

public interface IClientContract {
    void Broadcast(string message);
}

接下来通过设置集线器的依赖关系来安排测试并运行被测方法。

[TestMethod]
public void _GetNoficationTest() {
    // Arrange.
    var hub = new HubServer();
    var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
    var groups = new Mock<IClientContract>();
    var message = "Message to send";
    var groupName = "Manager";

    hub.Clients = mockClients.Object;
    groups.Setup(_ => _.Broadcast(message)).Verifiable();
    mockClients.Setup(_ => _.Group(groupName)).Returns(groups.Object);

    // Act.
    hub.GetNofication(message);

    // Assert.
    groups.VerifyAll();
}

另一个选择是使用ExpandoObject 伪造组,因为在这种情况下Clients.Group 返回dynamic

[TestMethod]
public void _GetNoficationTest_Expando() {
    // Act.
    var hub = new HubServer();
    var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
    dynamic groups = new ExpandoObject();
    var expected = "Message to send";
    string actual = null;
    var groupName = "Manager";
    bool messageSent = false;

    hub.Clients = mockClients.Object;
    groups.Broadcast = new Action<string>(m => {
        actual = m;
        messageSent = true;
    });
    mockClients.Setup(_ => _.Group(groupName)).Returns((ExpandoObject)groups);

    // Act.
    hub.GetNofication(expected);

    // Assert.
    Assert.IsTrue(messageSent);
    Assert.AreEqual(expected, actual);
}

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2018-04-02
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多