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

如何使用NSubstitute和XUnit模拟返回布尔值的UpdateOneAsync方法?

现有Mock写法有效性判断

无法满足你的Mock需求,核心原因是参数类型不匹配:
你业务代码中repository.UpdateOneAsync的第一个入参是Expression<Func<User, bool>>类型的过滤器表达式,而你写的Arg.Any<User>()是匹配User类型的参数,类型完全不对应,Mock框架无法命中你配置的返回规则。
另外你的业务代码本身存在语法缺陷:缺少try关键字包裹可能抛出异常的代码段,会直接编译失败,这也是你当前方法总是返回false的可能原因之一。

updateTerms参数的传入规则

updateTerms对应UpdateOneAsync方法的第二个入参,类型为UpdateDefinition<User>,你可以根据测试场景选择两种匹配规则:

  • 宽松匹配:不需要校验具体更新逻辑,仅需要触发Mock返回的场景,直接传入Arg.Any<UpdateDefinition<User>>()即可,不管业务代码传入的更新规则是什么,都会命中该Mock规则。
    对应正确的Mock写法示例(以NSubstitute为例):
    // 测试UpdateOneAsync返回false的场景
    repository.UpdateOneAsync(
        Arg.Any<Expression<Func<User, bool>>>(), 
        Arg.Any<UpdateDefinition<User>>()
    ).Returns(false);
    
    // 测试异常捕获分支返回false的场景,需要让Mock方法抛出异常
    repository.UpdateOneAsync(
        Arg.Any<Expression<Func<User, bool>>>(), 
        Arg.Any<UpdateDefinition<User>>()
    ).Throws<Exception>();
    
  • 严格匹配:需要校验业务代码更新的字段和值是否符合预期的场景,需要构造和业务代码完全一致的更新定义,即Builders<User>.Update.Set(entity => entity.Name, 测试用例中传入的newName参数值),只有业务代码传入的更新规则和你构造的内容完全匹配时,才会命中Mock规则。

内容的提问来源于stack exchange,提问作者Noelia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:15:00