請考慮下面的代碼:如何模擬另一個類負責實例化的類?
type
TFoo1 = class
public
procedure DoSomething1;
end;
TFoo2 = class
private
oFoo1 : TFoo1;
public
procedure DoSomething2;
procedure DoSomething3;
constructor Create;
destructor Destroy; override;
end;
procedure TFoo1.DoSomething1;
begin
ShowMessage('TFoo1');
end;
constructor TFoo2.Create;
begin
oFoo1 := TFoo1.Create;
end;
destructor TFoo2.Destroy;
begin
oFoo1.Free;
inherited;
end;
procedure TFoo2.DoSomething2;
begin
oFoo1.DoSomething1;
end;
procedure TFoo2.DoSomething3;
var
oFoo1 : TFoo1;
begin
oFoo1 := TFoo1.Create;
try
oFoo1.DoSomething1;
finally
oFoo1.Free;
end;
end;
我創建單元測試類,我堅持就可以了。我的問題都是關於嘲笑對象的最佳方式以及我應該使用的設計模式。我是單元測試的課程不是由我創建的。
在下面的例子中,我需要模擬
Foo1
由於其發送到Web服務,我可以在我的單元測試期間不叫請求。但Foo1
正在由TFoo2
構造函數創建,我無法嘲笑它。在這種情況下我該怎麼辦?我是否應該修改TFoo2
構造函數來接受這樣的對象Foo1
?constructor TFoo2.Create(aFoo1 : TFoo1) begin oFoo1 := aFoo1; end;
是否存在一種設計模式,表示我們需要傳遞類所依賴的所有對象,如上例所示?
方法
TFoo2.DoSomething3
創建Foo1
對象,然後釋放它。我是否也應修改該代碼以通過Foo1
對象?procedure TFoo2.DoSomething3(aFoo1 : TFoo1); begin aFoo1 := aFoo1.DoSomething1; end;
有什麼設計模式支持我提出的建議嗎?如果是這樣,我可以告訴我工作的公司中的所有開發人員,我們需要遵循XXX模式,以便使單元測試更容易。
非常好,謝謝。元類思想非常酷。 – 2011-05-02 13:48:25
你知不知道是否有任何設計模式告訴我們,我們需要通過構造函數或其他方法傳遞對象依賴關係?它是裝飾者模式嗎? – 2011-05-02 14:46:09
你在找什麼是依賴注入或控制反轉。您已經在TFoo2上創建了TFoo1的依賴關係。相反,您想通過接口或構造函數將TFoo2「注入」到TFoo1中。請記住,如果你在編寫單元測試時遇到困難,那麼你做得不對。 ;-) – 2011-05-02 15:08:42