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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:53:14