Пример того, как имитировать контекст с помощью интерфейса:
/// <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>>();
}
}