我试图使用Moq测试WebAPI控制器和Redis数据库之间的集成,使用StackExchange.Redis客户端,并且无法解决如何在包含回调或其他断言行为的模拟异步方法上设置可验证的期望。
通常,我会使用以下语法:
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 --我不知道如何将其中一个标记为可验证的。有什么想法吗?
发布于 2016-04-05 15:06:08
对于异步方法,需要在使用回调之前从安装程序返回已完成的Task。
看看这里:
Using Moq to mock an asynchronous method for a unit test
你正在创建一个任务,但从未开始它,所以它永远不会完成。但是,不要仅仅启动任务--而是改为使用
Task.FromResult,这将为您提供一个已经完成的任务:
这行得通
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();https://stackoverflow.com/questions/36428740
复制相似问题