У меня есть приложение .NET Core, которое использует концентраторы SignalR.
После выполнения некоторой бизнес-логики, 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 => {})
.
Затем я вызываю конечную точку, которая должна генерировать событие, используя 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
.