Я новичок с контейнерами для инъекций зависимостей, и я пытаюсь использовать их в сочетании с Mocking.Тестирование класса, не указанного в разделе интерфейса
Допустим, у меня есть контроллер и список (модель):
IBlahList = interface
property Items[AIndex: integer]: IBlah read GetItem;
end;
IController = interface
property List: IBlahList read GetList;
end;
Реализация IController будет выглядеть примерно так (обратите внимание, что это в implementaion
разделе:
implementation
TController = class (TInterfacedObject, IController)
private
FList: IBlahList;
function GetList: IBlahList;
public
constructor Create(const AList: IBlahList);
end;
И то, конечно, я бы зарегистрировал этот класс (а также один для IBlahList) с помощью GlobalContainer
:
GlobalContainer.RegisterType<TController>.Implements<IController>;
Я размещаю TController в разделе implementation
, как это было предложено различными источниками (ну, Ник Ходжес в любом случае!), Так что мы не можем напрямую ссылаться на класс TController.
Теперь, просто сказать, что я хочу, чтобы проверить мою реализацию ICollection в модульном тесте:
procedure TestSomething
var
LMockList: TMock<IBlahList>;
LController: IController;
begin
LMockList := TMock<IBlahList>.Create;
// Oops, I can't do this, I can't access TController
LController := TController.Create(LMockList);
end;
Итак, мой вопрос, я должен переместить класс TController в мой interface
раздел, так что я могу проверить это, или есть какой-то другой способ передать макет IBlahList контроллеру, который я еще не нашел?
+1 Это хорошее решение. Я могу видеть только один недостаток: код приложения (в отличие от кода тестирования) теперь может также напрямую создавать контроллер вместо того, чтобы _forced_ проходить через GlobalContainer (макет-фреймворк). Но вы можете, конечно, поместить объявление функции в раздел интерфейса под управлением условного обозначения DUNIT. Что выглядит намного чище, чем перемещение предложения 'реализация'. –
Подождите секунду. Вы хотите, чтобы код приложения проходил через фреймворк? Зачем ты этого хочешь? –