2013-04-17 3 views
2

Я пытаюсь отделить существующий код, чтобы его можно было протестировать. Я представил интерфейсы, чтобы удалить зависимость от объектов пользовательского интерфейса. Проблема в том, что для параметра RegisterComponent < T> для терминала Spring требуется параметр TComponentType, поэтому я не могу позвонить RegisterComponent < IMyProgressBar> Мне нужно позвонить в RegisterType < TMyProgressBar> .Implements < IMyProgressBar> что означает, что я должен использовать модуль, содержащий определение класса progressbar в DUnit, который побеждает цель использования DIContainer совместно с ServiceLocater, чтобы запросить индикатор прогресса, когда мне это нужно.Как вы можете скомпоновать интерфейс с контейнером DI с пружиной без регистрации типа класса?

Я не хочу создавать макетные классы и реализовывать интерфейсы вручную. Есть ли способ использовать Delphi.Mocks для автоматического издевательства интерфейса без указания класса реализации?

ответ

3

Вы, видимо, не использовать последнюю версию Spring4D как эта функция была реализована в ноябре прошлого года (см обновление в https://stackoverflow.com/a/11315141/587106)

В настоящее время не существует автоматического насмешливый контейнера, но мне нравится эта идея и будет выглядеть в реализацию чего-то, что делает это проще (возможно, путем улучшения расширения контейнера).

В настоящее время метод случае тест будет выглядеть следующим образом (используя DSharp издевается синтаксис):

procedure TMyTestCase.TestSomething; 
var 
    progressBarMock: Mock<IProgressBar>; 
    sut: TTestComponent; 
begin 
    container.RegisterType<TTestComponent>; 
    container.RegisterType<IProgressBar>.DelegateTo(
    function: IProgressBar 
    begin 
     Result := progressBarMock; 
    end); 
    container.Build; 

    // mock setup 

    sut := container.Resolve<TTestComponent>; 

    // perform test 
end; 

Во всяком случае я настоятельно рекомендую писать модульные тесты без использования DI контейнера.

Если ваш SUT имеет много зависимостей, что делает использование контейнера привлекательным, что часто является признаком нарушения определенных принципов проектирования.