You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:33:40