Objective c 台风:如何获得一个符合协议的实例用于生产,另一个用于测试?
我已经在Typhone中定义了一个应用程序组件 所以我想说:“这个类X需要注入符合Foo协议的东西。这是一个RealFoo,这是一个TestFoo。当我在现实生活中运行X时,我希望它得到一个RealFoo,但当我运行集成测试时,我希望它得到一个TestFoo”Objective c 台风:如何获得一个符合协议的实例用于生产,另一个用于测试?,objective-c,typhoon,Objective C,Typhoon,我已经在Typhone中定义了一个应用程序组件 所以我想说:“这个类X需要注入符合Foo协议的东西。这是一个RealFoo,这是一个TestFoo。当我在现实生活中运行X时,我希望它得到一个RealFoo,但当我运行集成测试时,我希望它得到一个TestFoo” 我该怎么做 有几种推荐的方法可以做到这一点: 使用台风修补器 允许加载基本部件,但一个或多个组件用另一个定义或给定对象实例修补。下面是一个使用模拟组件修补组件的示例: MiddleAgesAssembly* assembly = [Mid
我该怎么做 有几种推荐的方法可以做到这一点: 使用台风修补器 允许加载基本部件,但一个或多个组件用另一个定义或给定对象实例修补。下面是一个使用模拟组件修补组件的示例:
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。此功能的详细信息如下所示
编辑: 以上示例适用于台风2.0。这仍然适用于台风3.0,但更整洁的是组件激活:
MiddleAgesAssembly *assembly = [[MiddleAgesAssembly new] activate];
Knight *knight = [assembly knight];
- 在Typhone 3.0中,如果协作程序集由协议而不是具体类型支持,或者如果希望重写其中一个程序集,则只需声明协作程序集李>
- 您可以使用eg
[assembly.colloaboratingAssembly stormTrooper]