簡體   English   中英

測試過程是否在DUnitX中引發異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM