首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Moq设置针对异步方法的C#测试

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

Stack Overflow用户
提问于 2018-05-01 13:15:18
回答 1查看 4.5K关注 0票数 2

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

测试本身非常简单。

代码语言:javascript
运行
复制
[TestMethod]
public async Task UpdateItemAsync()
{
    var repository = GetRepository();
    var result = await repository.UpdateItemAsync("", new object());
    Assert.IsNotNull(result);
}

上面的GetRepository方法是用来设置各种模拟对象的,包括在它们上调用的安装程序。

代码语言:javascript
运行
复制
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;
}

下面列出了正在测试的代码,当执行带有等待的行时,它永远不会返回。

代码语言:javascript
运行
复制
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方法中GetRepository方法中的Moq对象上,但我不知道问题出在哪里。

EN

Stack Overflow用户

回答已采纳

发布于 2018-05-01 13:28:54

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

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

代码语言:javascript
运行
复制
client
    .Setup(_ => _.ReplaceDocumentAsync(It.IsAny<Uri>(), It.IsAny<object>(), It.IsAny<RequestOptions>()))
    .ReturnsAsync(new ResourceResponse<Document>());

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

票数 8
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50117170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档