Модульный тест Microsoft. Azure .ServiceBus TopicClient с использованием Moq - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь выполнить модульное тестирование Microsoft. Azure .ServiceBus (3.3.0) topi c и функциональность подписки. Но я не заинтересован в тестировании классов Microsoft. Azure .ServiceBus, но больше о том, как mock Отправьте сообщение в topi c и проверьте, существует ли это сообщение для указанных c topi c с подпиской.

На данный момент у меня есть супер простой класс Publisher с одним методом SendAsyn c. Как вы можете видеть здесь:

// Pseudo code, not full implementation!

public class Publisher : IPublisher
{
    private readonly ManagementClient _managementClient;
    private readonly TopicClientFactory _topicClientFactory;

    public Publisher(ManagementClient managementClient, TopicClientFactory topicClientFactory)
    {
        _managementClient = managementClient;
        _topicClientFactory = topicClientFactory;
    }

    public async Task SendAsync(myModel message)
    {
        ITopicClient topicClient = _topicClientFactory.Create("MyTopic");

        // encode message using message

        Message message = new Message(encodedMessage);
        await topicClient.SendAsync(message); // trying to mock & test this!
        await topicClient.CloseAsync();
    }
}

Фабрика имеет только один метод. При создании нового TopicClient с использованием фабрики я также возвращаю интерфейс ITopicClient. Не уверен, поможет ли это.

// Pseudo code, not full implementation!
public class TopicClientFactory
{
    public ITopicClient Create(string topicPath)
    {
        return new TopicClient("MyConnectionString", topicPath);
    }
}

Модульный тест:

[Fact]
public async Task Name()
{
    var managementClientMock = new Mock<ManagementClient>("MyConnectionString");
    var topicClientFactoryMock = new Mock<TopicClientFactory>("MyConnectionString");

    // mock topic client's send method!
    var topicClientMock = new Mock<ITopicClient>();
    topicClientMock.Setup(x =>
        x.SendAsync(It.IsAny<Message>())).Returns(Task.CompletedTask); // .Verifiable();

    // pass mocked topicClient to mocked factory
    topicClientFactoryMock.Setup(tc => tc.Create("topicPath")).Returns(topicClientMock.Object);

    var publisher = new Publisher(managementClientMock.Object, topicClientFactoryMock.Object);

    await publisher.SendAsync(command);

    // how to test if message has been sent?
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...