Я следовал этому сообщению в блоге , чтобы написать несколько интеграционных тестов с ASP.NET Core SignalR, и он прекрасно работает при отправке сообщений непосредственно на Hub
, но не через HubContext
. Порядок выполнения кода изменяется при использовании HubContext
.
[TestMethod]
public async Task HubContextHack()
{
//configure TestServer code ommitted
var hubContextMsg = string.Empty;
connection.On<string>("OnMessageRecievedFromHubContext", msg =>
{
hubContextMsg = msg;
});
connection.On<string>("OnMessageRecievedFromHub", msg =>
{
hubMsg = msg;
});
await connection.StartAsync();
var message = "Integration Testing in Microsoft AspNetCore SignalR";
var hubContext = server.Host.Services
.GetService<IHubContext<StrongEchoHub, IStrongEchoHub>>();
await hubContext.Clients.All.OnMessageRecievedFromHubContext(message);
//if I uncomment out this line my test passes as
//the execution order of my code changes
//await connection.InvokeAsync("SendFromHub", "blah " + message);
hubContextMsg.Should().Be(message);
}
Если я поставлю точку останова в hubContextMsg = msg;
, то эта строка будет выполнена, но только после выполнения hubContextMsg.Should().Be(message);
.
Полный тестовый проект здесь .
Почему вызов await connection.InvokeAsync(...);
делаетon
обработчики запускаются перед выполнением кода, который идет после него?
Как мне получить такое же поведение при использовании HubContext
?