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