当前位置: 首页 > 知识库问答 >
问题:

针对异步方法使用Moq设置C#测试

习狐若
2023-03-14

我正在尝试使用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方法中,但我不确定问题出在哪里。

共有1个答案

盖嘉庆
2023-03-14

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

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

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

您通常希望避免手动更新任务

 类似资料:
  • 我在单元测试中使用了Moq框架。这是UpdateApplication测试方法: 我在运行测试时遇到一个异常: 我应该如何编写使用Moq更新和删除操作的单元测试?

  • 我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符

  • 同步调用异步方法最安全的方法是什么?

  • 本文向大家介绍C#实现异步GET的方法,包括了C#实现异步GET的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现异步GET的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。