DUnitX整数测试始终异常通过,添加无关调用才正常求助
问题描述
我定义了如下测试用例:
[Test] [TestCase('TestSetAsInteger 001.', '0')] [TestCase('TestSetAsInteger 002.', '666')] procedure TestSetAsInteger(IntVal : integer);
实现代码如下:
procedure TTestKeyValueList.TestSetAsInteger(IntVal: integer); begin FKVL.AsInteger['testkey'] := IntVal; Assert.AreEqual(IntVal, FKVL.AsInteger['testkey']); end;
FKVL中的方法是存根,测试本应失败,但实际始终通过。
当我将测试实现修改为:
procedure TTestKeyValueList.TestSetAsInteger(IntVal: integer); begin FKVL.AsInteger['testkey'] := IntVal; Sleep(1); //可以是任何操作,比如调用FKVL.Count等 Assert.AreEqual(IntVal, FKVL.AsInteger['testkey']); end;
测试就会按预期失败。这很奇怪,请问我哪里操作有误?
问题分析与解决
这种情况大概率是存根实现的AsInteger属性用了临时缓存或者延迟同步逻辑,导致直接读取时拿到的是刚赋值的临时值,而非存根实际存储的内容。
具体来说:
- 执行
FKVL.AsInteger['testkey'] := IntVal;时,存根的setter可能只是把值存在临时变量里,没真正更新到模拟的存储结构中。 - 紧接着读取
FKVL.AsInteger['testkey']时,getter直接返回了这个临时变量,所以断言通过。 - 插入
Sleep(1)或调用FKVL.Count这类操作时,存根内部状态被触发同步(或临时变量被重置),此时读取会拿到存根实际返回的默认值,断言就会失败。
解决办法:
- 检查存根实现,确保
AsInteger的setter真正把值写入模拟存储容器,而非只存在临时变量。 - 或者在存根的getter逻辑里,强制跳过临时缓存,直接返回模拟存储值,这样能立刻暴露存根未正确实现的问题。
内容的提问来源于stack exchange,提问作者RED MONKEY
相关产品推荐
相关产品推荐

