[英]Moq ReturnsAsync() with parameters
我正在嘗試像這樣模擬存儲庫的方法
public async Task<WhitelistItem> GetByTypeValue(WhitelistType type, string value)
使用 Moq ReturnsAsync,如下所示:
static List<WhitelistItem> whitelist = new List<WhitelistItem>();
var whitelistRepositoryMock = new Mock<IWhitelistRepository>();
whitelistRepositoryMock.Setup(w => w.GetByTypeValue(It.IsAny<WhitelistType>(), It.IsAny<string>()))
.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
與 lambdas 一起使用, ReturnsAsync
與問題的代碼示例完全相同。 不再需要使用Task.FromResult()
了。 您只需要指定 lambda 委托參數的類型。 否則,您將收到相同的錯誤消息:
無法將 lambda 表達式轉換為類型“Model.WhitelistItem”,因為它不是委托類型
舉個例子,以下適用於最新版本的 Moq:
whitelistRepositoryMock.Setup(w => w.GetByTypeValue(It.IsAny<WhitelistType>(), It.IsAny<string>()))
.ReturnsAsync((WhitelistType type, string value) =>
{
return (from item in whitelist
where item.Type == type && item.Value == value
select item).FirstOrDefault();
});
您必須將Returns
與Task.FromResult
一起使用:
.Returns((WhitelistType type, string value) =>
{
return Task.FromResult(
(from item in whitelist
where item.Type == type && item.Value == value
select item).FirstOrDefault()
);
});
我知道這是一個老問題,但這里給出的一個答案對我不起作用,我能夠弄清楚。 看來,你必須包括嘲笑函數的參數類型的類型參數ReturnsAsync()
第一,其次是嘲笑類類型,然后返回類型。
例如: .ReturnsAsync<T1, T2, TMock, TResult>((arg1, arg2) => { ... } )
其中T1, T2
是模擬函數參數的類型, (arg1, arg2)
是調用模擬時給出的實際參數。
因此,鑒於 OP 中的代碼,它看起來像這樣:
whitelistRepositoryMock.Setup(w => w.GetByTypeValue(It.IsAny<WhitelistType>(), It.IsAny<string>()))
.ReturnsAsync<WhitelistType, string, IWhiteListRepository, WhitelistItem>((type, value) =>
{
return (from item in whitelist
where item.Type == type && item.Value == value
select item).FirstOrDefault();
});
編輯:我后來在上一個答案中意識到類型是在確實有效的 lambda 中給出的。 如果像我一樣省略類型,則不會。 你必須使用我使用的表格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.