Модульное тестирование методов cosmosDb с использованием Moq - PullRequest
1 голос
/ 08 ноября 2019

Поскольку документации для тестирования CosmosDb нет, я пытаюсь сделать это сам, но у меня проблемы с этим. Например, я хочу проверить метод вставки, который выглядит следующим образом:

public async Task AddSignalRConnectionAsync(ConnectionData connection)
{
    if (connection != null)
    {
        await this.container.CreateItemAsync<ConnectionData>(connection, new PartitionKey(connection.ConnectionId));
    }
}

Что мне нужно сделать, это проверить, успешно ли этот метод создает элемент на cosmosDb или, по крайней мере, подделывает успешное создание. Как я могу это проверить?

1 Ответ

2 голосов
/ 08 ноября 2019

Чтобы выполнить модульное тестирование этого метода в отдельности, необходимо протестировать зависимости тестируемого класса.

Принимая пример, подобный следующему

public class MySubjectClass {
    private readonly Container container;

    public MySubjectClass(Container container) {
        this.container = container;
    }

    public async Task AddSignalRConnectionAsync(ConnectionData connection) {
        if (connection != null) {
            var partisionKey = new PartitionKey(connection.ConnectionId);
            await this.container.CreateItemAsync<ConnectionData>(connection, partisionKey);
        }
    }        
}

В приведенном вышеНапример, тестируемый метод зависит от Container и ConnectionData, которые необходимо указать при тестировании.

Если вы не хотите использовать фактический экземпляр Container, рекомендуется использовать макетзависимости, которые могут иметь нежелательное поведение, если используется фактическая реализация.

public async Task Should_CreateItemAsync_When_ConnectionData_NotNull() {
    //Arrange
    //to be returned by the called mock
    var responseMock = new Mock<ItemResponse<ConnectionData>>();

    //data to be passed to the method under test
    ConnectionData data = new ConnectionData {
        ConnectionId = "some value here"
    };

    var containerMock = new Mock<Container>();
    //set the mock expected behavior
    containerMock
        .Setup(_ => _.CreateItemAsync<ConnectionData>(
            data, 
            It.IsAny<PartitionKey>(), 
            It.IsAny<ItemRequestOptions>(),
            It.IsAny<CancellationToken())
        )
        .ReturnsAsync(responseMock.Object)
        .Verifiable();

    var subject = new MySubjectClass(containerMock.Object);

    //Act
    await subject.AddSignalRConnectionAsync(data);

    //Assert
    containerMock.Verify(); //verify expected behavior
}

Проверяемый метод объекта может быть проверен на то, что он вызовет ожидаемый метод, когда параметр не равен нулю, на основе указанного выше изолированного модульного тестапример.

Использование действительного Container сделало бы это интеграционным тестом, который потребовал бы другого типа схемы тестирования.

...