Unit-тестирование. Создаем moq для IHubContext (SignalR)
Сайтостроение | создано: 22.01.2019 | опубликовано: 22.01.2019 | обновлено: 13.01.2024 | просмотров: 2549 | всего комментариев: 0
Чтобы протестировать возможность отправки сообщение через SignalR придется использовать Mock библиотеки. На примере Moq покажу как создать заглушки для интерфейсов IHubContext.
Что имеем
В моем проекте используется SignalR для отправки сообщений пользователям. Hub очень прост и вот как он выглядит:
public class MessagesHub: Hub<IBasicCommunication>
{
private readonly ILogger<MessagesHub> _logger;
/// <inheritdoc />
public MessagesHub(ILogger<MessagesHub> logger)
{
_logger = logger;
}
}
Вот что из себя представляет интерфейс IBasicCommunication, который используеся для закрытия обобщенного типа:
/// <summary>
/// Server messages hub interface
/// </summary>
public interface IBasicCommunication
{
/// <summary>
/// Message
/// </summary>
/// <returns></returns>
Task SendMessageAsync(BasicMessage message);
}
Unit-тест для IHubContext
И, наконец, пример того, как можно обложить заглушками IHubContext<T> при использовании SignalR:
[Fact]
[Trait("MessageHub", "SendMessageAsync")]
public async Task ItShould()
{
// arrange
var messageHub = new Mock<IHubContext<MessagesHub, IBasicCommunication>>();
var mockClientProxy = new Mock<IBasicCommunication>();
var mockClients = new Mock<IHubClients<IBasicCommunication>>();
mockClients.Setup(clients => clients.User(It.IsAny<string>())).Returns(mockClientProxy.Object);
messageHub.Setup(x => x.Clients).Returns(() => mockClients.Object);
var data = AutoFixtureBuilder.Instance.Create<BasicMessage>();
// act
await messageHub.Object.Clients.User("identifier").SendMessageAsync(data);
// assert
mockClientProxy.Verify(x => x.SendMessageAsync(It.IsAny<BasicMessage>()), Times.Once);
}
В строке 9, определяется метод, который используется при вызове. Вы, соответственно, можете самостоятельно настроить через Setup moq результаты для других вызовов методов.
Unit-тесты рулят и педалят! Зеленых вам unit-тестов!