下面的 C# mock 代码,编译通过,但运行时总是报错
var redisDatabaseMock = new Mock<IRedisDatabase>();
redisDatabaseMock
.Setup(x => x.GetOrCreateAsync(
It.IsAny<string>(),
It.IsAny<TimeSpan>(),
It.IsAny<Func<Task<UserDto>>>()))
.Returns(async (Func<Task<UserDto>> func) => await func());
var redisClientMock = new Mock<IRedisClient>();
redisClientMock
.Setup(x => x.GetDefaultDatabase())
.Returns(redisDatabaseMock.Object);
var redisClientFactoryMock = new Mock<IRedisClientFactory>();
redisClientFactoryMock
.Setup(x => x.GetRedisClient(It.IsAny<string>()))
.Returns(redisClientMock.Object);
var result = await redisClientFactoryMock.Object
.GetRedisClient("default")
.GetDefaultDatabase()
.GetOrCreateAsync("test", TimeSpan.FromSeconds(10), () => Task.FromResult(new UserDto("Cnblogs")));
Console.WriteLine(result);
public record UserDto(string Name);
错误信息如下
Unhandled exception. System.NotSupportedException: Unsupported expression: x => x.GetOrCreateAsync<UserDto>(It.IsAny<string>(), It.IsAny<TimeSpan>(), It.IsAny<Func<Task<UserDto>>>(), When.Always, CommandFlags.None)
GetOrCreateAsync 是扩展方法,Moq 不支持 mock 扩展方法