.NET 8 Moq GetRequiredKeyedService Setup错误如何排查解决?

摘要:.NET 8 Moq mock GetRequiredKeyedService Setup报错 项目代码里有地方用到IServiceProvider.GetRequiredKeyedService<T&
.NET 8 Moq mock GetRequiredKeyedService Setup报错 项目代码里有地方用到IServiceProvider.GetRequiredKeyedService<T>来解析服务,在写单元测试时需要Mock它,本以为像下面这样写就可以了: var serviceProvider = new Mock<IServiceProvider>(); serviceProvider.Setup(x => x.GetRequiredKeyedService<AAA>(It.IsAny<BBB>())).Returns(new CCC()); 没想到报错了: Test method threw exception: System.NotSupportedException: Unsupported expression: x => x.GetRequiredKeyedService(It.IsAny<Type>(), It.IsAny<object>()) Extension methods (here: ServiceProviderKeyedServiceExtensions.GetRequiredKeyedService) may not be used in setup / verification expressions. Stack Trace:  Guard.IsOverridable(MethodInfo method, Expression expression) line 87 MethodExpectation.ctor(LambdaExpression expression, MethodInfo method, IReadOnlyList`1 arguments, Boolean exactGenericTypeArguments, Boolean skipMatcherInitialization, Boolean allowNonOverridable) line 236 ExpressionExtensions.<Split>g__Split|5_0(Expression e, Expression& r, MethodExpectation& p, Boolean assignment, Boolean allowNonOverridableLastProperty) line 256 ExpressionExtensions.Split(LambdaExpression expression, Boolean allowNonOverridableLastProperty) line 170 Mock.SetupRecursive[TSetup](Mock mock, LambdaExpression expression, Func`4 setupLast, Boolean allowNonOverridableLastProperty) line 728 Mock.Setup(Mock mock, LambdaExpression expression, Condition condition) line 562 Mock`1.Setup[TResult](Expression`1 expression) line 645 有点奇怪,难道GetRequiredKeyedService不是接口方法?查看.NET源代码,果然,GetRequiredKeyedService是IServiceProvider的扩展方法,而我们知道Moq是不支持Setup扩展方法的。
阅读全文