Жизненный цикл 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 (несмотря на комментарий в источнике)
Это еще более важно, если вы будете делать более сложные вещи с макетом, так как он может поддерживать работу или указывать на недействительные ссылки после теста. Я видел несколько серьезных сбоев в конце тестовых приложений, которые не очищали их макеты.