我有一個介面函式,有一個常陣列和一個匿名函式作為引數:
我有一個介面函式,有一個常陣列和一個匿名函式作為引數。
TCodeword = array[0.7] of Char。
TIntFunc = reference to function: Integer。
IMyInterface = interface(IInvokable)
function DoSomething(const codeword: TCodeword; func: TIntFunc): Boolean。
end。
我想模擬這個介面來測驗一個正在使用它的物件:
function IntFunc: Integer;
begin
結果 := 5;
end;
procedure Test;
var
我的InterfaceMock。Mock<IMyInterface>。
我的Interface。IMyInterface。
begin
MyInterfaceMock := Mock<IMyInterface>.Create(TMockbehavior.Strict) 。
MyInterfaceMock.Setup.Returns(true).When.DoSomething(arg.IsAny<TCodeword>, arg.IsAny<TIntFunc> ())。
MyInterface := MyInterfaceMock;
MyInterface.DoSomething('12345678'/span>, IntFunc)。
end。
當運行時,一個ENotSupportedException: 'Type is not supported: TCodeword'在設定時被提出。 誰能解釋一下為什么這是一個不支持的型別?我怎樣才能傳遞一個未指定的TCodeword來正確模擬該函式呢?
另外,我試著在Setup中傳遞明確的引數:
procedure Test;
var
我的InterfaceMock。Mock<IMyInterface>。
我的Interface。IMyInterface。
begin
MyInterfaceMock := Mock<IMyInterface>.Create(TMockbehavior.Strict) 。
MyInterfaceMock.Setup.Rurns(true).When.DoSomething('12345678', IntFunc)。
MyInterface := MyInterfaceMock;
MyInterface.DoSomething('12345678', IntFunc)。
end。
這樣一來,常量陣列可以作業,但匿名函式就不行了。我得到一個EMockException: 'unexpected call of function DoSomething(const codeword: TCodeword; func: TIntFunc) 。Boolean with arguments: nil, (array)';
我怎樣才能使其正常作業?我很高興得到任何幫助!
uj5u.com熱心網友回復:
有多個問題:
正如例外宣告的那樣,
TCodeword型別不被支持--那是因為typeKindtkArray的型別不被支持--我不記得那是什么原因,因為內部的處理與tkDynArray非常相似。我將解決這個問題,并在完成后對這個答案進行編輯。當把一個普通函式傳遞給一個方法參考引數時,編譯器會構建必要的代碼,將普通函式包裝成一個方法參考,并且使用一個介面物件來實作方法參考的介面(畢竟匿名方法只是介面)。然而,每次發生這種情況時,它都會這樣做,這意味著兩行將
IntFunc傳遞給TIntFunc的引數是兩個不同的指標。這就是為什么在內部,引數匹配器會回傳False。如果你想避免這種情況,你需要將IntFunc放入一個TIntFunc型別的區域變數中,并傳遞給它。因為這樣編譯器只建立了一次包裝代碼,而且在兩種情況下,區域變數的值都會被傳遞給DoSomething呼叫。
Update: fixed in develop branch
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/316478.html
標籤:
