Delphi 在 DUnit 中模拟生命周期
Delphi Mocks lifecycle in DUnit
我想测试最简单的情况:测试模拟的策略对象。 (看:策略模式)。
如果我在 TTestCase.setUp
方法中创建一个 TMock<T>
并将其存储在 TTestCase
实例属性中,那么我是否应该 free/NIL [=] 中的模拟变量16=] 方法?
mock := NIL
编译不通过:
[dcc32 Error] TestUnit2.pas(44): E2010 Incompatible types: 'Delphi.Mocks.TMock<T>' and 'Pointer'.
mock.free
运行没有任何错误,但我不确定是否应该调用它。进程退出其范围时释放的模拟(在测试用例析构函数之后)。
我应该call/set什么吗?
代码:
Unit2.pas:
unit Unit2;
interface
type
TPartClass = class
public
function foo( x_ : integer ) : integer; virtual;
end;
TMainClass = class
private
fPart : TPartClass;
public
constructor create( part_ : TPartClass );
function bar( x_ : integer ) : integer;
end;
implementation
function TPartClass.foo( x_ : integer ) : integer;
begin
result := x_ shl 1;
end;
constructor TMainClass.create( part_ : TPartClass );
begin
inherited create;
fPart := part_;
end;
function TMainClass.bar( x_ : integer ) : integer;
begin
result := fPart.foo( x_ );
end;
测试Unit2.pas:
unit TestUnit2;
interface
uses
Delphi.Mocks, TestFramework, Unit2;
type
TTestTMainClass = class(TTestCase)
strict private
fPartClass : TMock<TPartClass>;
FMainClass: TMainClass;
public
procedure SetUp; override;
procedure TearDown; override;
published
procedure Testbar;
end;
implementation
procedure TTestTMainClass.SetUp;
begin
fPartClass := TMock<TPartClass>.create;
FMainClass := TMainClass.Create( fPartClass );
end;
procedure TTestTMainClass.TearDown;
begin
FMainClass.Free;
FMainClass := NIL;
//fPartClass.Free;
//fPartClass := NIL;
end;
procedure TTestTMainClass.Testbar;
var
ReturnValue: Integer;
x_: Integer;
begin
fPartClass.Setup.WillReturn( 10 ).When.foo( 5 );
x_ := 5;
ReturnValue := FMainClass.bar(x_);
checkTRUE( returnValue = 10 );
end;
您应该始终清理在安装期间创建的 TearDown 中的所有内容。尽管稍后可能会清理一些东西,但这是一种很好的做法,可以让您在单元测试时查找资源泄漏。
由于 TMock<T>
是内部保存接口的记录,您需要确保在测试后清理这些接口 运行 尽管它们可能会被下一个 SetUp 或测试用例实例获取时覆盖销毁。
这就是 .Free 的用途(尽管源代码中有注释)
一旦您使用模拟执行更复杂的操作,这一点就更加重要,因为它可能会在测试后保持活动状态或指向无效引用。我在测试应用程序结束时看到了一些严重的崩溃,这些崩溃没有清理他们的模拟。
我想测试最简单的情况:测试模拟的策略对象。 (看:策略模式)。
如果我在 TTestCase.setUp
方法中创建一个 TMock<T>
并将其存储在 TTestCase
实例属性中,那么我是否应该 free/NIL [=] 中的模拟变量16=] 方法?
mock := NIL
编译不通过:
[dcc32 Error] TestUnit2.pas(44): E2010 Incompatible types: 'Delphi.Mocks.TMock<T>' and 'Pointer'.
mock.free
运行没有任何错误,但我不确定是否应该调用它。进程退出其范围时释放的模拟(在测试用例析构函数之后)。
我应该call/set什么吗?
代码:
Unit2.pas:
unit Unit2;
interface
type
TPartClass = class
public
function foo( x_ : integer ) : integer; virtual;
end;
TMainClass = class
private
fPart : TPartClass;
public
constructor create( part_ : TPartClass );
function bar( x_ : integer ) : integer;
end;
implementation
function TPartClass.foo( x_ : integer ) : integer;
begin
result := x_ shl 1;
end;
constructor TMainClass.create( part_ : TPartClass );
begin
inherited create;
fPart := part_;
end;
function TMainClass.bar( x_ : integer ) : integer;
begin
result := fPart.foo( x_ );
end;
测试Unit2.pas:
unit TestUnit2;
interface
uses
Delphi.Mocks, TestFramework, Unit2;
type
TTestTMainClass = class(TTestCase)
strict private
fPartClass : TMock<TPartClass>;
FMainClass: TMainClass;
public
procedure SetUp; override;
procedure TearDown; override;
published
procedure Testbar;
end;
implementation
procedure TTestTMainClass.SetUp;
begin
fPartClass := TMock<TPartClass>.create;
FMainClass := TMainClass.Create( fPartClass );
end;
procedure TTestTMainClass.TearDown;
begin
FMainClass.Free;
FMainClass := NIL;
//fPartClass.Free;
//fPartClass := NIL;
end;
procedure TTestTMainClass.Testbar;
var
ReturnValue: Integer;
x_: Integer;
begin
fPartClass.Setup.WillReturn( 10 ).When.foo( 5 );
x_ := 5;
ReturnValue := FMainClass.bar(x_);
checkTRUE( returnValue = 10 );
end;
您应该始终清理在安装期间创建的 TearDown 中的所有内容。尽管稍后可能会清理一些东西,但这是一种很好的做法,可以让您在单元测试时查找资源泄漏。
由于 TMock<T>
是内部保存接口的记录,您需要确保在测试后清理这些接口 运行 尽管它们可能会被下一个 SetUp 或测试用例实例获取时覆盖销毁。
这就是 .Free 的用途(尽管源代码中有注释)
一旦您使用模拟执行更复杂的操作,这一点就更加重要,因为它可能会在测试后保持活动状态或指向无效引用。我在测试应用程序结束时看到了一些严重的崩溃,这些崩溃没有清理他们的模拟。