0

我想测试最简单的情况:测试模拟策略对象。(看:策略模式)。

TMock<T>如果我在方法中创建 aTTestCase.setUp并将其存储在TTestCase实例属性中,那么我应该释放/NILtearDown方法中的模拟变量吗?

mock := NIL不编译:

[dcc32 错误] TestUnit2.pas(44):E2010 不兼容的类型:“Delphi.Mocks.TMock<T>”和“指针”。

运行没有任何错误,mock.free但我不确定我应该调用它。当进程退出其范围(在测试用例析构函数之后)时释放的模拟。

我应该打电话/设置什么吗?

编码:

单元2.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;

测试单元2.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;
4

1 回答 1

1

您应该始终清理在安装期间创建的 TearDown 中的所有内容。即使事情可能会在以后清理,这是一种很好的做法,并且可以让您在单元测试时查找资源泄漏。

由于TMock<T>是内部保存接口的记录,因此您需要确保在测试运行后清理这些接口,尽管它们可能会被下一个 SetUp 覆盖或当测试用例实例被破坏时。

这就是 .Free 的用途(尽管源代码中有评论)

一旦你用模拟做更复杂的事情,这一点就更重要了,因为它可能使事情保持活力或在测试后指向无效的引用。我在测试应用程序结束时看到了一些严重的崩溃,这些应用程序没有清理它们的模拟。

于 2017-03-14T15:42:06.533 回答