Внедрение макета с помощью Typhoon

Я пытаюсь написать XCTest и внедрить фиктивную зависимость с помощью Typhoon.

Вот код в моем ViewController:

   - (instancetype)init {
    self = [super init];

    MDMainAssembly *assembly = (MDMainAssembly *) [TyphoonComponentFactory defaultFactory];
    self.alertManager = [assembly alertManager];

    return self;
   }

Вот как я пытаюсь изменить инъекцию:

    self.mockedAlertManager = mock([MDAlertManager class]);

    MDMainAssembly *assembly = [MDMainAssembly assembly];
    TyphoonComponentFactory *factory = [TyphoonBlockComponentFactory factoryWithAssembly:assembly];
    TyphoonPatcher *patcher = [[TyphoonPatcher alloc] init];
    [patcher patchDefinition:[assembly alertManager] withObject:^id {
        return self.mockedAlertManager;
    }];

    [factory attachPostProcessor:patcher];

Однако тесты не проходят, потому что эту фабрику невозможно установить по умолчанию. Настраиваю на AppDelegate фабрике:

    TyphoonComponentFactory *factory = [[TyphoonBlockComponentFactory alloc] initWithAssemblies:@[
        [MDMainAssembly assembly],
    ]];
    [factory makeDefault];

Как выйти из этой ситуации?


person Eugen Martynov    schedule 20.02.2014    source источник


Ответы (1)


Мы создали функцию defaultFactory для ограниченного числа случаев. Главное это:

  • Получение доступа к Typhoon и поиск зависимости для класса, которым не управляет Typhoon. Обычно это не требуется.

Хотя вы можете использовать его в тестах, мы рекомендуем вместо этого создавать и уничтожать контейнер Typhoon для каждого запуска теста. Чтобы избежать дублирования, вы можете создать метод следующим образом:

@implementation IntegrationTestUtils

+ (TyphoonComponentFactory*)testAssembly
{
    TyphoonComponentFactory* factory = [[TyphoonBlockComponentFactory alloc] initWithAssemblies:@[
        [MyAppAssembly assembly],
        [MyAppKernel assembly],
        [MyAppNetworkComponents assembly],
        [MyAppPersistenceComponents assembly]
    ]];

    id <TyphoonResource> configurationProperties = [TyphoonBundleResource withName:@"Configuration.properties"];
    [factory attachPostProcessor:[TyphoonPropertyPlaceholderConfigurer configurerWithResource:configurationProperties]];

    return factory;
}

. . при необходимости к этой сборке можно прикрепить патчер.

Присоединение средства исправления к фабрике по умолчанию:

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

person Jasper Blues    schedule 20.02.2014
comment
Но как мой контроллер представления получит доступ к настроенной фабрике, или мне также следует перенести экземпляр контроллера на фабрику? - person Eugen Martynov; 20.02.2014
comment
Да, мы рекомендуем создавать контроллеры представления с помощью Typhoon. Затем добавьте зависимости для текущего варианта использования. Но для следующего варианта использования внедрите сборку: bit.ly/1nQce7k и найдите следующую граф объектов. Или используйте: bit.ly/1a93dFE или: bit.ly/1mdnpZ1 . . Если это не подходит для вас, и вы хотите придерживаться defaultAssembly, возможно, более простой способ имитировать — предоставить сеттер, чтобы вы могли внедрить фиктивную фабрику. . Это зависит от того, хотите ли вы настроенный интеграционный тест или чистый модульный тест. - person Jasper Blues; 20.02.2014
comment
Пробовали ли вы пример приложения? github.com/typhoon-framework/Typhoon-example - person Jasper Blues; 20.02.2014
comment
Я обратился к некоторым источникам, когда столкнулся с описанной проблемой. Я использую свой опыт работы с Dagger и Guice. Поскольку с Android у вас нет доступа к созданию экземпляров Activity, вы всегда вводите объект на более поздних этапах с предварительно настроенным контейнером. - person Eugen Martynov; 20.02.2014
comment
Инъекционная фабрика также является возможным решением - person Eugen Martynov; 20.02.2014
comment
Дайте нам знать, как вы относитесь к рекомендуемым подходам, если они у вас работают. Снова резюме: внедрить зависимости для текущего варианта использования в контроллер представления. . для перехода к следующему контроллеру представления введите factory (выдавая себя за интерфейс сборки), чтобы вы могли получить следующий VC. 3 способа сделать это, упомянутые в комментариях выше. - person Jasper Blues; 20.02.2014
comment
Обновление: мы сняли ограничение на установку фабрики по умолчанию более одного раза. - person Jasper Blues; 13.04.2014
comment
спасибо за обновление, так что теперь я мог играть с фабрикой по умолчанию в своих тестах :) - person Eugen Martynov; 13.04.2014
comment
@EugenMartynov Да, сейчас это мастер (в стиле Typhoon 2.0). . мы выпустим 2.0 через ~ 2 недели. Использовать: обновление модуля «Тайфун», :head - person Jasper Blues; 13.04.2014