我想模擬一個名爲GetOrAddAsync的函數。它的定義爲:Moq和異步使用LazyCache的樂趣
Task<T> GetOrAddAsync<T>(string key, Func<Task<T>> addItemFactory, DateTimeOffset expires);
當我使用它在我實際的代碼我用它喜歡:
DateTimeOffset cacheTimeout = new DateTimeOffset(DateTime.Now.AddHours(config.CacheHours));
Func<Task<IEnumerable<int>>> func = async() => await (from s in dbContext.Names select s.First).ToListAsync();
return await cache.GetOrAddAsync(key, func, cacheTimeout);
所以基本上如果該鍵存在,它會返回什麼在它,如果不是,它會創建一個密鑰,然後用從Func <>中傳遞的數據填充它。
我嘲諷的這種嘗試至今如下:
cache.Setup(x => x.GetOrAddAsync(It.IsAny<string>(), It.IsAny<Func<Task<IEnumerable<int>>>>(), It.IsAny<DateTimeOffset>()))
.ReturnsAsync(async (string key, Func<Task<IEnumerable<int>>> func, DateTimeOffset policy) =>
{
return await func.Invoke();
});
然而,這是返回一個錯誤:
無法轉換lambda表達式鍵入「IEnumerable的」,因爲它不是一個委託類型。
我的心,願與這種語法:)
我太親近:)。謝謝你的工作! – user441521