如何在单元测试中模拟SignalR的Clients.Group?

3

我正在为SignalR应用程序编写模拟测试用例。我刚刚开始参考单元测试SignalR应用程序,但我的要求与那里显示的示例略有不同。 以下是我在谷歌上完成的代码。

SignalRHub

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

我是Unit Test应用程序的新手,只想确认这是否是模拟SignalR Groups的正确方法。


1
你是否收到任何错误信息,还是这个意思是进行代码审查? - Nkosi
@Nkosi 没有错误,测试成功通过。这只是为了代码审查,以检查是否正确模拟?如果不是,请您帮忙纠正。 - Shri
我测试了你之前提供的代码,但是它没有通过测试。我的回答是基于你的代码无法正常工作这一事实的。 - Nkosi
我的应用程序使用上述代码测试通过。正如我告诉你的那样,我是编写模拟测试用例的初学者,我只想确认我是否正确地做了这件事。 - Shri
我在这里发布了另一个单元测试组的示例,以防有所帮助:https://dev59.com/l3_aa4cB1Zd3GeqP1lKn#46953636 - tomRedox
1个回答

2

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

Hubs组是可以模拟的

客户端合同需要更新必要的方法。在这种情况下,您将不得不添加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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接