2017-03-17 57 views
0

在我的單元測試中,需要設置一個模擬TList<T>。我如何設置模擬TList<T>.count屬性讀取的返回值?TList <T> .count利用Delphi Mocks模擬返回值

當我When後使用count編譯錯誤信息是:

[dcc32 Error] Unit1.pas(40): E2014 Statement expected, but expression of type 'Integer' found 

當我When編譯錯誤消息後使用getCount是:

[dcc32 Error] Unit1.pas(40): E2003 Undeclared identifier: 'getCount' 

count屬性讀取直接fCount屬性。有沒有解決方法?

type 
    TMyClass = class 
    end; 

procedure TXXXTestCase.testYYY; 
var 
    mL : TMock<TList<TMyClass>>; 
begin 
    mL := TMock<TList<TMyClass>>.create; 
    try 
    // ... 
    mL.Setup.WillReturn(1).When.Count; 
    // ... 
    finally 
    mL.Free; 
    end; 
end; 
+0

除非您使用低級掛鉤,否則模擬「Count」值的唯一方法是將虛擬值添加到列表中。至於'When',它看起來像Mocks只能處理使用虛擬getter方法的屬性讀取(所以它可以掛鉤方法)。此外,像「MyList.Count;」這樣的語句在Delphi中無效(相同的編譯器錯誤)。您必須將您的「Count」檢查包裹在另一個與Mocks兼容的班級/方法中。 –

+0

是的,我的想法是一樣的:使用getCount虛擬方法繼承TList或創建函數getListCount(aL_:TList ):integer begin aL_.count;結束;方法在用戶類中。他們都是黑客。重構代碼只是爲了能夠測試。但不是正確的方向。 :( –

+0

嘲笑一個列表是一個壞主意,只是把你想要它包含的值 –

回答

0

好的。受Stefan Glinke評論的啓發,我創建了一個實用程序來避免訪問一個嘲弄對象的屬性。我只是通過模擬工具類的模擬來獲得(假)價值。

一小段代碼片段看起來像我原來的一個:

value = object1.property.list.count; 

這種內心深處看的解決方案:

value = object1Utility.getListCount(object); 

的TObjec1tUtility調用Object2Utility它的響應,但在這種情況下,我可以嘲笑Object1Utility,不需要將模擬添加到模擬中。