在我的单元测试中,我使用Typoon和TyphoonBlockComponentFactory对象来实例化模拟和对象等。我的所有单元测试都按顺序同时运行,每个单元测试都只使用需要运行的程序集建立自己的工厂。
它每次都会创建该工厂并使其成为默认工厂,因此被测试的类可以从该工厂实例化它们的依赖项。但是,TyphoonComponentFactory的'makeDefault'方法被封装在dispatch_once块中,这意味着它在应用的生命周期中只能发生一次。
为什么?我的某些方法从根本上是错误的吗?我希望能够在我的tearDown方法中以某种方式摧毁台风状态,但我不知道怎么做——不能摧毁一个单例!
makeDefault方法仅用于将Typhoon集成到遗留代码中——这些遗留代码不是由Typhoon管理的。我们现在不鼓励在其他地方使用它,因为它会产生对Typhoon的紧密依赖,这可能会导致这些问题。要模拟它,你需要搅拌。
对于一个对象图加载另一个对象图来说是非常常见的——例如从一个视图控制器(带有注入的依赖项)转换到另一个视图控制器。从Typhoon中查找依赖项的更好方法是将组件工厂作为依赖项注入。这可以通过以下方式完成:
- 让你的类符合台风组件工厂意识
- 注入程序集,例如:
Ex1:使用属性Inject
注入程序集- (id)loyaltyManagementController
{
return [TyphoonDefinition withClass:[LoyaltyManagementViewController class]
properties:^(TyphoonDefinition* definition)
{
definition.scope = TyphoonScopePrototype;
//Inject the TyphoonComponentFactory posing as an assembly
[definition injectProperty:@selector(assembly)];
}];
}
。如果遵循这种方法,所有的测试都可以实例化它们自己的工厂、补丁程序、覆盖组件等,而无需调用makeDefault。
卸货单例
顺便提一下,你可以通过调用TyphoonComponentFactory的unload方法来卸载你的单例作用域组件,但在正常使用下不应该这样做。更新:
上述所有内容仍然适用,除了我们现在移动了多次设置默认工厂的限制。这现在只是触发一个警告。