Жизненный цикл Delphi Mocks в DUnit

Я хочу протестировать простейший случай: тестирование объекта макета стратегии. (посмотрите на: шаблон стратегии).

Если я создам TMock<T> в TTestCase.setUp методы и хранить его в TTestCase атрибут экземпляра, то я должен освободить /NIL переменную макета в tearDown метод?

mock := NIL не компилируется:

[Ошибка dcc32] TestUnit2.pas(44): E2010 Несовместимые типы: "Delphi.Mocks.TMock" и "Указатель".

mock.free работает без каких-либо ошибок, но я не уверен, что я должен это назвать. Макет освобождается, когда процесс выходит из области видимости (после деструктора тестового примера).

Должен ли я позвонить / установить что-нибудь?

Код:

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;

TestUnit2.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;

1 ответ

Решение

Вы должны всегда очищать все в TearDown, которое вы создали во время SetUp. Несмотря на то, что вещи могут быть позже очищены, это хорошая практика, которая позволит вам искать утечки ресурсов во время модульного тестирования.

поскольку TMock<T> это запись, которая содержит внутренние интерфейсы, которые вам необходимы, чтобы удостовериться, что они очищены после запуска теста, хотя они могут быть переопределены следующим SetUp или когда экземпляр тестового набора будет уничтожен.

Это то, для чего.Free (несмотря на комментарий в источнике)

Это еще более важно, если вы будете делать более сложные вещи с макетом, так как он может поддерживать работу или указывать на недействительные ссылки после теста. Я видел несколько серьезных сбоев в конце тестовых приложений, которые не очищали их макеты.

Другие вопросы по тегам