首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在模拟的异步方法上设置可验证的预期?

如何在模拟的异步方法上设置可验证的预期?
EN

Stack Overflow用户
提问于 2016-04-05 14:07:23
回答 1查看 2.4K关注 0票数 6

我试图使用Moq测试WebAPI控制器和Redis数据库之间的集成,使用StackExchange.Redis客户端,并且无法解决如何在包含回调或其他断言行为的模拟异步方法上设置可验证的期望。

通常,我会使用以下语法:

代码语言:javascript
复制
const string KEY = "some_key";
var db = new Mock<IDatabase>();
db.Setup(d => d.HashSetAsync(KEY, It.IsAny<HashEntry[]>(),It.IsAny<CommandFlags>()))
    .Callback<RedisKey,HashEntry[],CommandFlags>((key, hash, flags) => {
                hash.ShouldContain(entry => entry.Name == "customerid");
                hash.ShouldContain(entry => entry.Name == "quotenumber");
     })
     .Verifiable();

但这给了我:

'Moq.Language.Flow.IReturnsThrows‘不包含“可验证”的定义,也找不到接受“Moq.Language.Flow.IReturnsThrows”类型的第一个参数的扩展方法“可验证”(您是缺少使用指令还是程序集引用?)

如果我在db.HashSetAsync调用中将db.HashSet更改为db.HashSet,它将按预期工作。在常规方法上设置回调似乎会返回一个ICallbackResult,但是在异步方法调用上设置回调将返回一个IReturnsThrows --我不知道如何将其中一个标记为可验证的。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-05 15:06:08

对于异步方法,需要在使用回调之前从安装程序返回已完成的Task

看看这里:

Using Moq to mock an asynchronous method for a unit test

你正在创建一个任务,但从未开始它,所以它永远不会完成。但是,不要仅仅启动任务--而是改为使用Task.FromResult,这将为您提供一个已经完成的任务:

这行得通

代码语言:javascript
复制
const string KEY = "some_key";
var db = new Mock<IDatabase>();
db.Setup(d => d.HashSetAsync(KEY, It.IsAny<HashEntry[]>(), It.IsAny<CommandFlags>()))
    .Returns(Task.FromResult<object>(null))
    .Callback<RedisKey, HashEntry[], CommandFlags>((key, hash, flags) => {
        hash.ShouldContain(entry => entry.Name == "customerid");
        hash.ShouldContain(entry => entry.Name == "quotenumber");
    })
    .Verifiable();
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36428740

复制
相关文章

相似问题

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