Модульный тест Microsoft.Azure.ServiceBus TopicClient с использованием Moq

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

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

// 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 с помощью factory я также возвращаю интерфейс 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?
}

person kerpekri    schedule 06.04.2020    source источник
comment
Похоже, это может быть связано с тем, чего я хочу достичь - stackoverflow.com/questions/47197897/   -  person kerpekri    schedule 06.04.2020