gpt4 book ai didi

delphi - 测试过程是否在 DUnitX 中引发异常

转载 作者:行者123 更新时间:2023-12-03 15:23:29 25 4
gpt4 key购买 nike

我正在使用 DUnitX 框架,并尝试测试该过程是否引发异常。

目前我有以下测试程序:

procedure TAlarmDataTest.TestIdThrowsExceptionUnderFlow;
begin
Input := 0;
Assert.WillRaise(Data.GetId(input), IdIsZeroException, 'ID uninitialized');
end;

当我进行编译时,出现错误“没有可以使用这些参数调用的‘WillRaise’的重载版本。”

是否有更好的方法来检查过程是否引发自定义异常,或者我应该使用 try, except block ,如果捕获异常则通过该 block ?

最佳答案

WillRaise的第一个参数是TTestLocalMethod。声明为:

type
TTestLocalMethod = reference to procedure;

换句话说,您应该传递 WillRaise 可以调用的过程。你没有那样做。您正在调用该过程。这样做:

Assert.WillRaise(
procedure begin Data.GetId(input); end,
IdIsZeroException,
'ID uninitialized'
);

重点是 WillRaise 需要调用预期引发的代码。如果您调用该代码,那么在准备要传递给 WillRaise 的参数时将会引发异常。因此,我们需要推迟执行预期引发的代码,直到进入 WillRaise 为止。将代码包装在匿名方法中是实现这一目标的一种简单方法。

就其值(value)而言,WillRaise 的实现如下所示:

class procedure Assert.WillRaise(const AMethod : TTestLocalMethod; 
const exceptionClass : ExceptClass; const msg : string);
begin
try
AMethod;
except
on E: Exception do
begin
CheckExceptionClass(e, exceptionClass);
Exit;
end;
end;
Fail('Method did not throw any exceptions.' + AddLineBreak(msg),
ReturnAddress);
end;

因此,WillRaise 将对过程的调用包装在 try/except block 中,如果未引发所需的异常,则会失败。

如果您仍然难以理解这一点,那么我怀疑您需要温习 anonymous methods 的知识。 。一旦你掌握了这一点,我相信它就会显而易见。

关于delphi - 测试过程是否在 DUnitX 中引发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22682785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com