如何使用 Moq 模拟异步通用缓存工厂?

问题描述 投票:0回答:1

我正在尝试使用 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.Task
1[int]'.

有什么想法吗?

c# unit-testing generics async-await moq
1个回答
0
投票

模拟异步函数返回值应使用 ReturnsAsync 而不是 Returns。一旦你解决了这个问题,我还会根据特定的测试在模拟设置中使用更具体的对象。

© www.soinside.com 2019 - 2024. All rights reserved.