Unit-тестирование. Создаем moq для IHubContext (SignalR)
Сайтостроение | создано: 22.01.2019 | опубликовано: 22.01.2019 | обновлено: 13.01.2024 | просмотров: 2125 | всего комментариев: 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-тестов!