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
相关产品推荐
相关产品推荐

