Asp.net 如何测试信号器2集线器仅通知单个用户?

Asp.net 如何测试信号器2集线器仅通知单个用户?,asp.net,asp.net-mvc,unit-testing,signalr,signalr-hub,Asp.net,Asp.net Mvc,Unit Testing,Signalr,Signalr Hub,我已经完成了,但是现在我想测试我的集线器在某些情况下只通知单个用户 我的集线器代码如下所示: public class NotificationsHub : Hub { public void RaiseAlert(string message) { Clients.All.RaiseAlert(message); } public void RaiseNotificationAlert(string userId) {

我已经完成了,但是现在我想测试我的集线器在某些情况下只通知单个用户

我的集线器代码如下所示:

public class NotificationsHub : Hub
{
    public void RaiseAlert(string message)
    {
        Clients.All.RaiseAlert(message);
    }

    public void RaiseNotificationAlert(string userId)
    {
        if (userId == null)
        {
            // Notify all clients
            Clients.All.RaiseAlert("");
            return;
        }

        // Notify only the client for this userId
        Clients.User(userId).RaiseAlert("");

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

[Test]
public void NotifiesOnlySpecifiedUserWhenUserIdSent()
{
    // Adapted from code here: https://github.com/SignalR/SignalR/blob/dev/tests/Microsoft.AspNet.SignalR.Tests/Server/Hubs/HubFacts.cs

    // Arrange

    // Set up the individual mock clients
    var client1 = new Mock<IClientContract>();
    var client2 = new Mock<IClientContract>();
    var client3 = new Mock<IClientContract>();

    client1.Setup(m => m.RaiseAlert(It.IsAny<string>())).Verifiable();
    client2.Setup(m => m.RaiseAlert(It.IsAny<string>())).Verifiable();
    client3.Setup(m => m.RaiseAlert(It.IsAny<string>())).Verifiable();

    // set the Connection Context to return the mock clients
    var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
    mockClients.Setup(m => m.User("1")).Returns(client1.Object);
    mockClients.Setup(m => m.User("2")).Returns(client2.Object);
    mockClients.Setup(m => m.User("3")).Returns(client3.Object);

    // Assign our mock context to our hub
    var hub = new NotificationsHub
    {
        Clients = mockClients.Object
    };

    // Act
    hub.RaiseNotificationAlert("2");

    // Assert
    client1.Verify(m => m.RaiseAlert(It.IsAny<string>()), Times.Never);
    client2.Verify(m=>m.RaiseAlert(""), Times.Once);
    client3.Verify(m => m.RaiseAlert(It.IsAny<string>()), Times.Never);
}
我的用于检查所有客户端是否收到通知的单元测试如下所示(它基于Microsoft示例):

[测试]
public void通知SallUsersWhenNoUsersSpecified()
{
//基于:https://docs.microsoft.com/vi-vn/aspnet/signalr/overview/testing-and-debugging/unit-testing-signalr-applications
//安排
//这是假装的
var mockClients=new Mock();
mockClients.Setup(m=>m.RaiseAlert(It.IsAny()).Verifiable();
//模拟我们信号中心的客户
var mockClientConnCtx=new Mock();
Setup(m=>m.All).Returns(mockClientConnCtx.Object);
//将集线器的连接上下文设置为模拟上下文
var hub=新通知shub
{
Clients=mockClientConnCtx.Object
};
//行动
hub.RaiseNotificationAlert(空);
//断言
mockClients.Verify(m=>m.RaiseAlert(It.IsAny());
}

我不确定的是如何将由
var mockClients=new Mock()
行表示的客户机集合更改为一组单独的客户机,这样我就可以测试如果我通知用户1,那么用户2和3就不会被通知了?

我发现了另一个关于如何对组进行单元测试的问题,并指出了问题

查看这些示例,我发现我需要将模拟调用添加到
mockClients
User
方法中。结果是这样的:

public class NotificationsHub : Hub
{
    public void RaiseAlert(string message)
    {
        Clients.All.RaiseAlert(message);
    }

    public void RaiseNotificationAlert(string userId)
    {
        if (userId == null)
        {
            // Notify all clients
            Clients.All.RaiseAlert("");
            return;
        }

        // Notify only the client for this userId
        Clients.User(userId).RaiseAlert("");

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

[Test]
public void NotifiesOnlySpecifiedUserWhenUserIdSent()
{
    // Adapted from code here: https://github.com/SignalR/SignalR/blob/dev/tests/Microsoft.AspNet.SignalR.Tests/Server/Hubs/HubFacts.cs

    // Arrange

    // Set up the individual mock clients
    var client1 = new Mock<IClientContract>();
    var client2 = new Mock<IClientContract>();
    var client3 = new Mock<IClientContract>();

    client1.Setup(m => m.RaiseAlert(It.IsAny<string>())).Verifiable();
    client2.Setup(m => m.RaiseAlert(It.IsAny<string>())).Verifiable();
    client3.Setup(m => m.RaiseAlert(It.IsAny<string>())).Verifiable();

    // set the Connection Context to return the mock clients
    var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
    mockClients.Setup(m => m.User("1")).Returns(client1.Object);
    mockClients.Setup(m => m.User("2")).Returns(client2.Object);
    mockClients.Setup(m => m.User("3")).Returns(client3.Object);

    // Assign our mock context to our hub
    var hub = new NotificationsHub
    {
        Clients = mockClients.Object
    };

    // Act
    hub.RaiseNotificationAlert("2");

    // Assert
    client1.Verify(m => m.RaiseAlert(It.IsAny<string>()), Times.Never);
    client2.Verify(m=>m.RaiseAlert(""), Times.Once);
    client3.Verify(m => m.RaiseAlert(It.IsAny<string>()), Times.Never);
}
公共接口IClientContract
{
void RaiseAlert(字符串消息);
}
[测试]
public void通知仅当未验证时指定为
{
//根据此处的代码改编:https://github.com/SignalR/SignalR/blob/dev/tests/Microsoft.AspNet.SignalR.Tests/Server/Hubs/HubFacts.cs
//安排
//设置各个模拟客户机
var client1=new Mock();
var client2=new Mock();
var client3=new Mock();
client1.Setup(m=>m.RaiseAlert(It.IsAny()).Verifiable();
client2.Setup(m=>m.RaiseAlert(It.IsAny()).Verifiable();
client3.Setup(m=>m.RaiseAlert(It.IsAny()).Verifiable();
//设置连接上下文以返回模拟客户端
var mockClients=new Mock();
mockClients.Setup(m=>m.User(“1”)).Returns(client1.Object);
mockClients.Setup(m=>m.User(“2”)).Returns(client2.Object);
mockClients.Setup(m=>m.User(“3”)).Returns(client3.Object);
//将模拟上下文分配给中心
var hub=新通知shub
{
Clients=mockClients.Object
};
//表演
集线器提升警报(“2”);
//断言
验证(m=>m.RaiseAlert(It.IsAny()),Times.Never);
client2.Verify(m=>m.RaiseAlert(“”),Times.Once);
验证(m=>m.RaiseAlert(It.IsAny()),Times.Never);
}