【发布时间】:2016-12-06 22:33:16
【问题描述】:
我正在尝试模拟一个名为 GetOrAddAsync 的函数。定义为:
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”,因为它不是委托类型。
我的头脑已经准备好用这个语法爆炸了:)
【问题讨论】:
标签: c# unit-testing moq