Пожалуйста, рассмотрите следующий код:
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, потому что он отправляет запрос в веб-службу, которую я не могу вызвать во время модульного тестирования. Но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, чтобы упростить модульное тестирование.