模拟 Context.ConnectionId 用于单元测试 Signalr .NetCore 消息传递中心
Mocking a Context.ConnectionId for Unit Testing Signalr .NetCore Messaging Hubs
我的问题是当我在 .Net CORE 中对我的 Signalr 集线器进行单元测试时,获取一个 context.connection ID 值以插入我的方法之一。我的方法在我的测试中看起来像这样 class:
[Fact]
public async Task TestWorkstationCreation()
{
Mock<IHubCallerClients<IWorkstation>> mockClients = new Mock<IHubCallerClients<IWorkstation>>();
Mock<IWorkstation> mockClientProxy = new Mock<IWorkstation>();
mockClients.Setup(clients => clients.All).Returns(mockClientProxy.Object);
_workstationHub.Clients = mockClients.Object;
await _workstationHub.RegisterWorkstation("WKS16", "Ready", new Dictionary<string, string> {{"OS", "Windows 10"}, {"Exam", "GRE, TOEFL"}});
mockClientProxy.Verify(c => c.WorkstationRegistered(It.IsAny<WorkstationDataModel>(), It.IsAny<string>()), Times.AtLeastOnce);
}
在我的中心 class,这是方法:
public async Task RegisterWorkstation(string id, string status, Dictionary<string, string> capabilities)
{
_logger.LogInformation(
"Registering a Workstation with id: {id}, status: {status}, and capabilities: {capabilities}",
id, status, string.Join(",", capabilities));
var workstationAdded = AddWorkstation(id, status, capabilities, Context.ConnectionId);
var message = workstationAdded == null
? $"A workstation with the id: {id} already exists!"
: $"A workstation with the id: {id}, status: {status}, and capabilities: {string.Join(",", capabilities)} " +
"was added to the current list of workstations available.";
await Clients.All.WorkstationRegistered(workstationAdded, message);
}
测试时,在Context.ConnectionId处抛出Object reference not set null pointer异常。有没有办法模拟一个可以使用的 Context.Connection Id?
我最终为单元测试做了这个并且成功了
[Fact]
public async Task TestWorkstationCreation()
{
Mock<IHubCallerClients<IWorkstation>> mockClients = new Mock<IHubCallerClients<IWorkstation>>();
Mock<IWorkstation> mockClientProxy = new Mock<IWorkstation>();
Mock<HubCallerContext> mockClientContext = new Mock<HubCallerContext>();
mockClients.Setup(clients => clients.All).Returns(mockClientProxy.Object);
mockClientContext.Setup(c => c.ConnectionId).Returns(Guid.NewGuid().ToString);
_workstationHub.Clients = mockClients.Object;
_workstationHub.Context = mockClientContext.Object;
await _workstationHub.RegisterWorkstation("WKS16", "Ready", new Dictionary<string, string> {{"OS", "Windows 10"}, {"Exam", "GRE, TOEFL"}});
mockClientProxy.Verify(c => c.WorkstationRegistered(It.IsAny<WorkstationDataModel>(), It.IsAny<string>()), Times.AtLeastOnce);
}
我的问题是当我在 .Net CORE 中对我的 Signalr 集线器进行单元测试时,获取一个 context.connection ID 值以插入我的方法之一。我的方法在我的测试中看起来像这样 class:
[Fact]
public async Task TestWorkstationCreation()
{
Mock<IHubCallerClients<IWorkstation>> mockClients = new Mock<IHubCallerClients<IWorkstation>>();
Mock<IWorkstation> mockClientProxy = new Mock<IWorkstation>();
mockClients.Setup(clients => clients.All).Returns(mockClientProxy.Object);
_workstationHub.Clients = mockClients.Object;
await _workstationHub.RegisterWorkstation("WKS16", "Ready", new Dictionary<string, string> {{"OS", "Windows 10"}, {"Exam", "GRE, TOEFL"}});
mockClientProxy.Verify(c => c.WorkstationRegistered(It.IsAny<WorkstationDataModel>(), It.IsAny<string>()), Times.AtLeastOnce);
}
在我的中心 class,这是方法:
public async Task RegisterWorkstation(string id, string status, Dictionary<string, string> capabilities)
{
_logger.LogInformation(
"Registering a Workstation with id: {id}, status: {status}, and capabilities: {capabilities}",
id, status, string.Join(",", capabilities));
var workstationAdded = AddWorkstation(id, status, capabilities, Context.ConnectionId);
var message = workstationAdded == null
? $"A workstation with the id: {id} already exists!"
: $"A workstation with the id: {id}, status: {status}, and capabilities: {string.Join(",", capabilities)} " +
"was added to the current list of workstations available.";
await Clients.All.WorkstationRegistered(workstationAdded, message);
}
测试时,在Context.ConnectionId处抛出Object reference not set null pointer异常。有没有办法模拟一个可以使用的 Context.Connection Id?
我最终为单元测试做了这个并且成功了
[Fact]
public async Task TestWorkstationCreation()
{
Mock<IHubCallerClients<IWorkstation>> mockClients = new Mock<IHubCallerClients<IWorkstation>>();
Mock<IWorkstation> mockClientProxy = new Mock<IWorkstation>();
Mock<HubCallerContext> mockClientContext = new Mock<HubCallerContext>();
mockClients.Setup(clients => clients.All).Returns(mockClientProxy.Object);
mockClientContext.Setup(c => c.ConnectionId).Returns(Guid.NewGuid().ToString);
_workstationHub.Clients = mockClients.Object;
_workstationHub.Context = mockClientContext.Object;
await _workstationHub.RegisterWorkstation("WKS16", "Ready", new Dictionary<string, string> {{"OS", "Windows 10"}, {"Exam", "GRE, TOEFL"}});
mockClientProxy.Verify(c => c.WorkstationRegistered(It.IsAny<WorkstationDataModel>(), It.IsAny<string>()), Times.AtLeastOnce);
}