请考虑下面的代码:如何模拟另一个类负责实例化的类?
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