Создать контекст концентратора SignalR вручную - PullRequest
0 голосов
/ 07 мая 2020

Я использую SignalR в своем приложении веб-API ASP. NET Core (3.1), и все работает нормально.

Однако мне нужен способ создания экземпляра концентратора контекст в моих модульных тестах (поскольку модульные тесты не поддерживают DI), и я не нашел ничего полезного в документации.

Например, у меня есть этот класс менеджера:

public MyManager(IHubContext<ChatHub> hubContext)
{
    this.hubContext = hubContext;
    ...
}

, который я должен создать в своих модульных тестах, но не знаю, как это сделать без контекста концентратора.

Кроме того, мне действительно не нужно имитировать вызовы SignalR, неважно, если они не т работать в тестах. Я просто хочу, чтобы мои тесты не провалились.

1 Ответ

0 голосов
/ 07 мая 2020

Пример того, как имитировать контекст с помощью интерфейса:

/// <summary>
/// The mock context.
/// </summary>
private static readonly Mock<IHubContext<NotificationsHub, INotificationsHub>> mockHubContext = new Mock<IHubContext<NotificationsHub, INotificationsHub>>();

Затем вы можете настроить его следующим образом:

/// <summary>
/// Builds the notifications hub.
/// </summary>
/// <returns>NotificationsHub.</returns>
private static Mock<IHubContext<NotificationsHub, INotificationsHub>> BuildNotificationsHub()
{
    // Mock

    Mock<INotificationsHub> hubClientsMock = new Mock<INotificationsHub>();

    // Setup

    mockHubContext.Setup(mock => mock.Clients.Group(It.IsAny<string>())).Returns(hubClientsMock.Object);
    mockHubContext.Setup(mock => mock.Clients.Group(It.Is<string>(group => group == "HubException"))).Throws(new HubException());
    mockHubContext.Setup(mock => mock.Groups).Returns(mockGroupManager.Object);

    // Return the manager

    return mockHubContext;
}

И что Microsoft рекомендует, если вы хотите ввести контекст, было бы лучше, если бы вы вводили его с помощью DI, а не в конструкторе, например:

private IHubContext<NotificationsHub, INotificationsHub> NotificationsHub
{
    get
    {
        return this.serviceProvider.GetRequiredService<IHubContext<NotificationsHub, INotificationsHub>>();
    }
}
...