为什么connection.InvokeAsync触发了回调,而其他方法却没有?

时间:2019-04-25 20:08:20

标签: c# .net testing signalr integration

我有一个使用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内部传递的处理程序。

0 个答案:

没有答案