[英]Test if a Procedure Throws an Exception in DUnitX
我正在使用DUnitX框架,我正在嘗試測試該過程是否拋出異常。
目前我有以下測試程序:
procedure TAlarmDataTest.TestIdThrowsExceptionUnderFlow;
begin
Input := 0;
Assert.WillRaise(Data.GetId(input), IdIsZeroException, 'ID uninitialized');
end;
當我去編譯時,我得到一個錯誤'沒有可以使用這些參數調用的'WillRaise'的重載版本。
有沒有更好的方法來檢查過程是否引發自定義異常,或者我應該使用try,除非捕獲異常時傳遞的塊除外?
WillRaise
的第一個參數是TTestLocalMethod
。 這被宣布為:
type
TTestLocalMethod = reference to procedure;
換句話說,您打算傳遞一個WillRaise
可以調用的過程。 你不是那樣做的。 你正在調用這個程序。 像這樣做:
Assert.WillRaise(
procedure begin Data.GetId(input); end,
IdIsZeroException,
'ID uninitialized'
);
關鍵是WillRaise
需要調用預期會引發的代碼。 如果調用代碼,則會在准備要傳遞給WillRaise
的參數時引發異常。 因此,我們需要推遲執行預期會提升的代碼,直到我們進入WillRaise
。 將代碼包裝在匿名方法中是實現此目的的一種簡單方法。
對於它的價值, 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塊中包裝對您的過程的調用,如果未引發所需的異常,則失敗。
如果你仍然在努力理解這一點,那么我懷疑你需要提高你對匿名方法的了解。 一旦掌握了這一點,我相信它會很明顯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.