gpt4 book ai didi

objective-c - 台风:如何让一个实例符合生产协议(protocol),另一个实例用于测试?

转载 作者:太空狗 更新时间:2023-10-30 04:02:04 27 4
gpt4 key购买 nike

我在 Typhoon 中定义了一个 ApplicationAssembly。

所以我想做的是说:“这个类 X 需要注入(inject)符合 Foo 协议(protocol)的东西。这是一个 RealFoo,这是一个 TestFoo。当我在现实生活中运行 X 时,我想要它得到一个 RealFoo,但是当我运行我的集成测试时,我希望它得到一个 TestFoo”。

我该怎么做?

最佳答案

有几种推荐的方法可以做到这一点:

使用台风修补程序

Typhoon-patcher允许加载基础程序集,但一个或多个组件用另一个定义或给定的对象实例修补。下面是一个使用 mock 修补组件的示例:

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 样式程序集,则可以为生产场景和测试场景加载一组不同的文件,包括基础程序集和任何环境相关文件。

在block-based assembly中可以实现同样的事情,如下:

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

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

有关更多信息,请参阅 Typhoon documentation 中的程序集模块化 ,或查看 sample app ,其中包含一个示例。


使用 TyphoonConfig

另一种方法是使用 TyphoonConfig。此功能的详细信息是 here .


编辑:

以上示例适用于 Typhoon 2.0。这在 Typhoon 3.0 中仍然可以正常工作,但更简洁的是程序集激活:

MiddleAgesAssembly *assembly = [[MiddleAgesAssembly new] activate]; 
Knight *knight = [assembly knight];
  • 在 Typhoon 3.0 中,如果协作程序集由协议(protocol)而非具体类型支持,或者您希望覆盖其中一个程序集,则只需声明协作程序集。
  • 您可以使用例如[assembly.colloaboratingAssembly stormTrooper]
  • 解析来自协作程序集的组件

关于objective-c - 台风:如何让一个实例符合生产协议(protocol),另一个实例用于测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19838570/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com