Почему я не могу установить фабрику по умолчанию в Typhoon более одного раза?

В своих модульных тестах я использую объекты Typoon и TyphoonBlockComponentFactory для создания макетов, объектов и так далее. Все мои модульные тесты запускаются одновременно, по порядку, и каждый настраивает свою собственную фабрику только с теми сборками, которые необходимы для запуска.

Он создает эту фабрику и каждый раз делает ее фабрикой по умолчанию, поэтому тестируемые классы могут создавать экземпляры своих зависимостей от фабрики. Но метод makeDefault в TyphoonComponentFactory заключен в блок dispatch_once, что означает, что он может произойти только один раз за время существования приложения.

Почему? какая-то часть моего подхода в корне неверна? Я хотел бы иметь возможность каким-то образом разрушить состояние Typhoon в моих методах tearDown, но я не знаю, как — не могу уничтожить синглтон!


person Nick Locking    schedule 15.03.2014    source источник


Ответы (1)


Метод makeDefault предназначен только для интеграции Typhoon в устаревший код — классы, не управляемые Typhoon. Теперь мы не рекомендуем использовать его где-либо еще, потому что он создает сильную зависимость от Typhoon, что может вызвать подобные проблемы. Чтобы издеваться над этим, вам нужно swizzle.

Очень часто один граф объектов загружает другой — например, при переходе от одного контроллера представления (с внедренными зависимостями) к другому. Лучший способ найти зависимость от Typhoon — внедрить фабрику компонентов в качестве зависимости. Это можно сделать следующими способами:

  • Ваш класс должен соответствовать TyphoonComponentFactoryAware.
  • Внедрить сборку, например:

Пример 1: вставка сборки с помощью вставки свойства

- (id)loyaltyManagementController
{
    return [TyphoonDefinition withClass:[LoyaltyManagementViewController class] 
        properties:^(TyphoonDefinition* definition)
    {
        definition.scope = TyphoonScopePrototype;
        //Inject the TyphoonComponentFactory posing as an assembly
        [definition injectProperty:@selector(assembly)]; 
    }];
}

. . если вы будете следовать этому подходу, все ваши тесты смогут создавать свои собственные фабрики, патчеры, компоненты переопределения и т. д. без вызова makeDefault.

Выгрузка синглтонов

Между прочим, вы можете выгрузить свои компоненты с областью действия singleton, вызвав метод unload TyphoonComponentFactory, но это не требуется при обычном использовании.

Обновление:

Все вышеперечисленное остается в силе, за исключением того, что теперь мы перенесли ограничение на установку фабрики по умолчанию более одного раза. Теперь это просто выдает предупреждение.

person Jasper Blues    schedule 15.03.2014
comment
Это имеет смысл, спасибо. Два вопроса: 1. Не приводит ли это к большому количеству шаблонного кода, поскольку с каждым классом должна быть связана фабрика? 2. Я думал, что использование 'defaultFactory' было способом скрытно обойти запрет на синглтоны, чтобы объекты, которые должны поддерживать состояние и быть доступными на глобальном уровне, могли просто существовать внутри фабрики Typhoon. Есть ли лучший подход, который Тайфун делает доступным вместо этого? Я застрял, прикрепив их к AppDelegate и оставив их там? - person Nick Locking; 15.03.2014
comment
Не такой шаблонный. 1. Добавьте свойство, соответствующее вашему типу сборки. б) Скажите тайфуну, чтобы он ввел его. . в настоящее время нет способа избежать этих двух строк кода. Но это по-прежнему рекомендуется вместо использования defaultFactory. - person Jasper Blues; 15.03.2014