【发布时间】:2011-05-02 13:26:59
【问题描述】:
请考虑以下代码:
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 模式,以便更轻松地进行单元测试。
【问题讨论】:
标签: delphi unit-testing design-patterns dependency-injection mocking