Moq使用参数返回Async()

我正在尝试模拟存储库的方法

public async Task GetByTypeValue(WhitelistType type, string value) 

使用Moq ReturnsAsync,如下所示:

 static List whitelist = new List(); var whitelistRepositoryMock = new Mock(); whitelistRepositoryMock.Setup(w => w.GetByTypeValue(It.IsAny(), It.IsAny())) .ReturnsAsync((WhitelistType type, string value) => { return (from item in whitelist where item.Type == type && item.Value == value select item).FirstOrDefault(); }); 

但我在行中收到此错误“… ReturnsAsync((WhitelistType type …):

无法将lambda表达式转换为类型’Model.WhitelistItem’,因为它不是委托类型

WhitelistType是这样的枚举:

 public enum WhitelistType { UserName, PostalCode } 

我按小时搜索,没有找到任何问题的答案。

有什么线索吗?

ReturnsAsync Returns一个不同, ReturnsAsync没有lambda版本。

修复:使用ReturnsTask.FromResult

 .Returns((WhitelistType type, string value) => { return Task.FromResult( (from item in whitelist where item.Type == type && item.Value == value select item).FirstOrDefault() ); }); 

接受的答案已过时。 您现在可以将ReturnsAsync与lambdas ReturnsAsync使用,就像在问题的代码示例中一样。 无需再使用Task.FromResult() 。 您只需要指定lambda委托参数的类型。 否则,您将收到相同的错误消息:

无法将lambda表达式转换为类型’Model.WhitelistItem’,因为它不是委托类型

举个例子,以下内容适用于最新版本的Moq:

 whitelistRepositoryMock.Setup(w => w.GetByTypeValue(It.IsAny(), It.IsAny())) .ReturnsAsync((WhitelistType type, string value) => { return (from item in whitelist where item.Type == type && item.Value == value select item).FirstOrDefault(); });