我正在尝试使用 Moq 来模拟以下缓存服务方法:
Task<TItem> GetOrCreateAsync<TItem>(string key, Func<Task<TItem>> factory)
该方法通常会检查缓存中的条目并返回它,或者如果没有找到,它会通过调用工厂创建一个新实例。我想创建一个简单地调用工厂并将结果返回给调用者的模拟。这是我尝试过的:
mock
.Setup(cache => cache.GetOrCreateAsync(It.IsAny<string>(), It.IsAny<Func<Task<It.IsAnyType>>>()).Result)
.Returns((string b, Func<Task<object>> c) => c().Result);
当我尝试使用此模拟时,出现错误:
Test method VolunteerHub.Tests.UnauthenticatedServiceTests.GetUnauthenticatedUser threw exception: System.InvalidCastException: Unable to cast object of type 'System.Threading.Tasks.Task
1[Moq.It+IsAnyType]' 键入 'System.Threading.Tasks.Task1[int]'.
有什么想法吗?
模拟异步函数返回值应使用 ReturnsAsync 而不是 Returns。一旦你解决了这个问题,我还会根据特定的测试在模拟设置中使用更具体的对象。