使用Moq模拟AWS Cognito Signup方法时遇CS0854错误的原因及解决问询
解决Moq模拟AWS Cognito SignUpAsync时的CS0854错误
错误成因
这个错误的根源在于Moq的Setup方法依赖C#表达式树解析方法调用,而表达式树不支持直接调用带有可选参数的方法。你看SignUpAsync的定义里有个可选的CancellationToken参数,默认值是default(CancellationToken)——这是C#的语法糖,编译时会自动补全默认值,但表达式树在解析的时候,没法处理这种“省略可选参数”的写法,所以当你只传第一个参数调用SignUpAsync时,就触发了这个错误。
解决方法
有两种简单的方式可以搞定这个问题:
1. 显式传递所有参数(包括可选参数的默认值)
在Setup里把第二个可选参数也明确写出来,要么用It.IsAny<CancellationToken>()匹配任意取消令牌,要么直接传递默认值:
// 方式一:匹配任意CancellationToken _cognito.Setup(m => m.SignUpAsync(It.IsAny<SignUpRequest>(), It.IsAny<CancellationToken>())) .ReturnsAsync(new SignUpResponse()); // 方式二:传递默认值,更贴近原方法的默认调用 _cognito.Setup(m => m.SignUpAsync(It.IsAny<SignUpRequest>(), default(CancellationToken))) .ReturnsAsync(new SignUpResponse());
这样表达式树就能正确解析完整的方法调用,不会再报错。
2. 额外提醒:避免使用async void
另外注意一下,你当前的Signup方法是async void,这种写法在测试场景里很容易导致不稳定——因为async void的方法无法被测试框架正确等待,建议改成async Task:
public async Task Signup(UserTO user) { var req = new SignUpRequest(); _cognito.Setup(m => m.SignUpAsync(It.IsAny<SignUpRequest>(), It.IsAny<CancellationToken>())) .ReturnsAsync(new SignUpResponse()); }
内容的提问来源于stack exchange,提问作者Kgn-web
相关产品推荐
相关产品推荐

