2014-03-27 69 views
3

我正在使用DUnitX框架,並試圖測試過程是否引發異常。測試過程是否在DUnitX中引發異常

目前,我有以下的測試程序:

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

當我去編譯,我得到一個錯誤「有沒有重載版本‘WillRaise’可以用這些參數來調用。」

有沒有更好的方法來檢查過程是否引發了自定義異常,還是應該使用try,除了在異常被捕獲時通過的塊?

回答

5

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 /包調用你的程序在嘗試except塊,並且如果需要的異常沒有引發故障。

如果你仍然在努力理解這一點,那麼我懷疑你需要刷新你對anonymous methods的瞭解。一旦你瞭解了這一點,我相信它會很明顯。

+0

這樣做,謝謝。 – TheEndIsNear

+0

這只是檢查引發異常。但是參數呢?用y參數中的x值創建異常嗎? –

+0

閱讀DUnitX的源代碼和文檔。看看各種WillRaiseXXX方法。 –

相關問題