我有一个使用SignalR集线器的.NET Core应用程序。
执行一些业务逻辑后,将使用一些有效负载来调用mediator.Publish
。有效负载随后到达使用IHubContext
发送适当消息的调度程序。
public class NotificationDispatcher : INotificationHandler<Notification>
{
private readonly IHubContext<NotificationDispatcher> _hubContext;
public NotificationDispatcher(IHubContext<NotificationDispatcher> hubContext)
{
_hubContext = hubContext;
}
public Task Handle(Notification notification, CancellationToken cancellationToken) =>
_hubContext
.Clients
.All
.SendAsync("Notify", notification, cancellationToken);
}
该代码正在运行,但我想对其进行集成测试。
我正在使用Microsoft.AspNetCore.Mvc.Testing
并像这样实例化连接
private static async Task<HubConnection> StartConnectionAsync(HttpMessageHandler handler, string hubName)
{
var hubConnection = new HubConnectionBuilder()
.WithUrl($"ws://localhost/{hubName}", o =>
{
o.HttpMessageHandlerFactory = _ => handler;
})
.Build();
await hubConnection.StartAsync();
return hubConnection;
}
然后,出于断言的目的,我使用connection.On("Notify", notification => {})
订阅了“ Notify”事件。
然后我使用WebApplicationFactory<Startup>
await factory.CreateClient().PostAsJsonAsync("/notify", notification);
所有“事件发布”代码均已成功执行(通过断点验证)。将使用正确的参数调用分派器,但是永远不会执行在connection.On
内部传递的处理程序。
但是,如果我在集线器本身内添加了一个Notify
方法:
public Task Notify(Notification notification) =>
Clients
.All
.SendAsync(nameof(Notification), notification);
然后调用connection.InvokeAsync("Notify", notification);
,执行在connection.On
中传递的处理程序。
预期:
调用调度程序后,将在connection.On
内部传递的处理程序将被执行。
实际:
除非我使用connection.On
,否则永远不会执行在connection.Invoke
内部传递的处理程序。