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的瞭解。一旦你瞭解了這一點,我相信它會很明顯。
這樣做,謝謝。 – TheEndIsNear
這只是檢查引發異常。但是參數呢?用y參數中的x值創建異常嗎? –
閱讀DUnitX的源代碼和文檔。看看各種WillRaiseXXX方法。 –