【问题标题】:Setting up a C# Test with Moq against Async methods针对异步方法使用 Moq 设置 C# 测试
【发布时间】:2018-05-01 21:31:48
【问题描述】:

我正在尝试使用 Moq 创建一组测试方法来覆盖外部依赖项。这些依赖关系本质上是异步的,我遇到了一组它们在等待时永远不会返回,所以我不确定我错过了什么。

测试本身非常简单。

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

上面的GetRepository 方法用于设置各种模拟对象,包括对它们调用的Setup。

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;
}

我确定错误出在GetRepository 方法中Moq 对象的Setup 方法中,但我不确定问题出在哪里。

【问题讨论】:

标签: c# unit-testing async-await moq


【解决方案1】:

您需要修复异步调用的设置

Moq 有一个ReturnsAsync,它允许模拟的异步方法调用流向完成。

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

您通常希望避免手动更新Tasks

【讨论】:

  • 谢谢。我不知道为什么我没有看到。
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 2016-04-16
  • 2014-01-18
  • 2012-11-11
  • 2021-10-15
  • 2012-10-01
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多