簡體   English   中英

帶參數的 Moq ReturnsAsync()

[英]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
    }

我搜索了幾個小時,但沒有找到我的問題的任何答案。

有什么線索嗎?

Moq v4.5.28 開始

您可以將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();
                                });

在 Moq v4.5.28 之前( Alexei Levenkov提供的答案)

您必須將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()第一,其次是嘲笑類類型,然后返回類型。

例如: .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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM