Unit-тестирование. Создаем moq для IHubContext (SignalR)

Просто о NET | создано: 22.01.2019 | опубликовано: 22.01.2019 | обновлено: 13.01.2024 | просмотров: 1781 | всего комментариев: 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-тестов!

Пока нет комментариев