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

JustMock配置返回带ID对象的方法时单元测试Assert断言失败如何解决

问题根源
  • 业务代码分支判断笔误:if(ID = 0)是赋值操作而非相等判断,该表达式返回值为0会被判定为false,永远走不到调用WritePerson的分支,ID会一直保持初始值0。正确写法应为if(ID == 0)。
  • Mock回调的赋值逻辑错误:C#中引用类型参数默认按值传递引用,你在DoInstead回调中执行a = UTobj仅修改了回调内部局部参数a的指向,没有修改业务代码中原有myObj实例的属性值,原对象的ID始终未更新。
  • 委托与方法签名不匹配:业务代码中WritePerson仅接收1个IMyObject类型参数,但你定义的SetIDDelegate<T1, T2>是双参数委托,签名不匹配会导致回调逻辑无法正常触发。
  • 测试代码调用Query方法缺失参数:Query方法定义要求传入Name字符串参数,测试代码中调用时未传参,语法存在错误。
修复步骤

第一步:修正业务代码的分支判断

将if(ID = 0)改为if(ID == 0),保证找不到用户时正常进入创建分支。

第二步:修正Mock配置,不需要额外定义委托,直接在DoInstead中修改传入对象的ID值

修改后的测试代码如下:

[TestMethod]
public void TestQuery_ReturnID()
{
    // 配置FindPerson返回0,触发创建分支
    Mock.Arrange(() => _mockSetID.FindPerson(Arg.IsAny<string>()))
        .Returns(0)
        .MustBeCalled();

    // 配置WritePerson回调,直接修改传入对象的ID
    Mock.Arrange(() => _mockSetID.WritePerson(Arg.IsAny<IMyObject>()))
        .DoInstead((IMyObject obj) =>
        {
            // 直接修改传入实例的ID,不要替换对象本身
            obj.ID = 12;
        })
        .MustBeCalled();

    // 配置WriteSomethingElse避免未Mock报错(如果不需要校验可以不用加MustBeCalled)
    Mock.Arrange(() => _mockSetID.WriteSomethingElse(Arg.IsAny<int>()))
        .MustBeCalled();

    // 传入测试用的Name参数调用Query
    int IDout = _objProcessObj.Query("测试用户名");

    // 校验所有Mock的调用符合预期
    Mock.Assert(_mockSetID);
    Assert.AreEqual(12, IDout);
}

修改后WritePerson被调用时会直接更新业务代码中创建的myObj实例的ID值,后续赋值和返回就会得到预期的12,断言可以正常通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:57:01