Тайфун: Как получить экземпляр, соответствующий протоколу для производства, и другой для тестов?
Я определил 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]