Тайфун: Как получить экземпляр, соответствующий протоколу для производства, и другой для тестов?

Я определил ApplicationAssembly в Тайфуне.

Поэтому я хочу сказать: "В этот класс X нужно добавить что-то, соответствующее протоколу Foo. Это RealFoo, это TestFoo. Когда я запускаю X в реальной жизни, я хочу, чтобы он получал RealFoo, но когда я запускаю свои интеграционные тесты, я хочу, чтобы он получил TestFoo".

Как я могу это сделать?

1 ответ

Решение

Есть несколько рекомендуемых способов сделать это:

Используйте Тайфун Патчер

Typhoon-patcher позволяет загружать базовую сборку, но с одним или несколькими компонентами, исправленными другим определением или данным экземпляром объекта. Вот пример исправления компонента с помощью макета:

MiddleAgesAssembly* assembly = [MiddleAgesAssembly assembly];
TyphoonComponentFactory* factory = [TyphoonBlockComponentFactory factoryWithAssembly:assembly];

TyphoonPatcher* patcher = [[TyphoonPatcher alloc] init];
[patcher patchDefinition:[assembly knight] withObject:^id
{
    Knight* mockKnight = mock([Knight class]);
    [given([mockKnight favoriteDamsels]) willReturn:@[
        @"Mary",
        @"Janezzz"
    ]];

    return mockKnight;
}];

[factory attachPostProcessor:patcher];

Knight* knight = [factory componentForKey:@"knight"];


Компоненты групповой среды вместе

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

То же самое может быть достигнуто в сборке на основе блоков следующим образом:

TyphoonComponentFactory* factory = [[TyphoonBlockComponentFactory alloc] initWithAssemblies:@[
    [MiddleAgesAssembly assembly],
    [StarWarsAssembly assembly]
]];

Knight* cavalryMan = [(MiddleAgesAssembly*) factory cavalryMan];
Knight* stormTrooper = [(StarWarsAssembly*) factory stormTrooper];

Для получения дополнительной информации обратитесь к разделу "Модуляризация сборок" в документации по " Тайфуну" или ознакомьтесь с примером приложения, которое содержит пример этого.


Используйте TyphoonConfig

Другой подход заключается в использовании TyphoonConfig. Подробности этой функции здесь.


Редактировать:

Приведенный выше пример для Тайфуна 2.0. Это все еще хорошо работает с Typhoon 3.0, но несколько более аккуратна активация сборки:

MiddleAgesAssembly *assembly = [[MiddleAgesAssembly new] activate]; 
Knight *knight = [assembly knight];
  • В Typhoon 3.0 вам нужно объявлять сотрудничающие сборки только в том случае, если они поддерживаются протоколом, а не конкретным типом, или если вы хотите переопределить одну из ваших сборок.
  • Вы можете разрешить компоненты из сотрудничающих сборок, например, с помощью [assembly.colloaboratingAssembly stormTrooper]
Другие вопросы по тегам