StopExpectingException 之后的 Delphi 7 Dunit 检查未按我的预期工作

标签 delphi exception delphi-7 dunit

下面的代码工作正常, calc... 生成异常,将其注释掉或更改 calc... 以不引发异常并且测试失败。

  StartExpectingException(exception);
  calcMembersPIPEndDate(EncodeDate(2005,01,01),true);
  StopExpectingException('calcMembersPIPEndDate - 1st after aDay');

我的问题是,在此之后我在此测试方法中放入的任何检查都不会执行。
所以

  checkEquals(1,0);
  StartExpectingException(exception);
  calcMembersPIPEndDate(EncodeDate(2005,01,01),true);
  StopExpectingException('calcMembersPIPEndDate - 1st after aDay');

第一次 checkEquals 失败

  StartExpectingException(exception);
  calcMembersPIPEndDate(EncodeDate(2005,01,01),true);
  StopExpectingException('calcMembersPIPEndDate - 1st after aDay');
  checkEquals(1,0);

通过 - 为什么?

我尝试找出我正在使用的 Dunit 版本:

testframework.pas has the following - which didn't seem to 
rcs_id: string = '#(@)$Id: TestFramework.pas,v 1.117 2006/07/19 02:45:55
rcs_version : string = '$Revision: 1.117 $';
versioninfo.inc
ReleaseNo : array[1..3] of Integer
          = (9,2,1);
ReleaseStr     = '9.2.1';
ReleaseWhen : array[1..6] of Integer
          = (2005,09,25,17,30,00);

最佳答案

这两个方法 StartExpectingExceptionStopExpectingException 不应该直接调用。

相反,您应该使用 ExpectedException 属性。当您设置此属性时,将调用 StartExpectingException。虽然您可以调用 StartExpectingException,但我相信预期的用法是您分配给 ExpectedException

至于StopExpectingException,您不调用它。框架调用它。它在执行测试方法的框架代码TTestCase.RunTest 中执行此操作。

因此您的测试用例代码可能如下所示:

ExpectedException := ESomeException;
raise ESomeException.Create(...);

当您声明您期待异常时,您的意思是您的测试方法将引发该异常。由于引发异常会改变控制流,因此引发异常后出现的代码将不会执行。异常会在调用堆栈中向上传播,直到被捕获。框架将捕获TTestCase.RunTest中的异常。如果您已指示捕获的异常是预期的,则测试将通过,否则将记录失败。

所有这一切的最终结果是,如果测试方法的最终行为是引发预期的异常,则可以使用 ExpectedException 机制。如果您想在引发异常后执行进一步的测试,那么 ExpectedException 机制根本没有用处。如果您想这样做,那么您应该:

  1. 在测试方法中编写您自己的异常处理代码,以检查异常是否按设计引发。
  2. 使用CheckException

关于StopExpectingException 之后的 Delphi 7 Dunit 检查未按我的预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36113452/

相关文章:

delphi - 在 64 位应用程序中使用 SetupAPI 枚举 USB HID 设备

delphi - TObjectList<T>.IndexOf 给出不正确的结果

c# - 如何在单元测试中模拟抛出异常?

Delphi 7 编译随着时间的推移变得越来越慢?

Delphi通过未知类类型选择对象

delphi - 使用 TEmbeddedWB 或 TWebBrowser 检测外部内容

delphi - 如何知道我的控件何时改变大小?

delphi - 设置未处理异常过滤器 : Continue execution 1 opcode further

java - 在 Java 中检查二维数组中邻居的更有效方法

c - 如何将c中的数据类型byte []转换为delphi?