首页 新闻 会员 周边

Moq Mock 时总是报错 "Unsupported expression"

0
悬赏园豆:30 [已解决问题] 解决于 2026-02-18 15:01

下面的 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)

dudu的主页 dudu | 高人七级 | 园豆:23366
提问于:2026-02-18 14:51
< >
分享
最佳答案
0

GetOrCreateAsync 是扩展方法,Moq 不支持 mock 扩展方法

dudu | 高人七级 |园豆:23366 | 2026-02-18 15:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册