Настройка теста C # с Moq против асинхронных методов - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь создать набор тестовых методов, используя Moq для покрытия внешних зависимостей. Эти зависимости асинхронны по своей природе, и я обнаружил, что когда они ожидаются, они никогда не возвращаются, поэтому я не уверен, что мне не хватает.

Сам тест очень прост.

[TestMethod]
public async Task UpdateItemAsync()
{
    var repository = GetRepository();
    var result = await repository.UpdateItemAsync("", new object());
    Assert.IsNotNull(result);
}

Приведенный выше метод GetRepository устанавливает на них различные фиктивные объекты, в том числе вызываемые программой установки.

private static DocumentDbRepository<object> GetRepository()
{
    var client = new Mock<IDocumentClient>();
    var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();

    client.Setup(m => m.ReplaceDocumentAsync(It.IsAny<Uri>(), It.IsAny<object>(), It.IsAny<RequestOptions>()))
        .Returns(() =>
        {
            return new Task<ResourceResponse<Document>>(() => new ResourceResponse<Document>());
        });

    var repository = new DocumentDbRepository<object>(configuration, client.Object);
    return repository;
}

Код, который тестируется, приведен ниже, и при выполнении строки с ожиданием он никогда не возвращается.

public async Task<T> UpdateItemAsync(string id, T item)
{
    var result = await Client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), item);
    return result.Resource as T;
}

Я уверен, что ошибка в методе Setup объекта Moq в методе GetRepository, но я не уверен, в чем проблема.

1 Ответ

0 голосов
/ 01 мая 2018

Вам необходимо исправить настройки асинхронных вызовов

У Moq есть ReturnsAsync, который позволял бы выполнять вызовы симулированных асинхронных методов до завершения.

client
    .Setup(_ => _.ReplaceDocumentAsync(It.IsAny<Uri>(), It.IsAny<object>(), It.IsAny<RequestOptions>()))
    .ReturnsAsync(new ResourceResponse<Document>());

Как правило, вы хотите избежать обновления Task s вручную

...