在我的单元测试中,我使用Typoon和TyphoonBlockComponentFactory对象来实例化模拟和对象,等等。我的所有单元测试按顺序运行,并且每个单元测试都只设置自己需要运行的组件。
它创建该工厂并使其每次都成为默认工厂,因此被测试的类可以从工厂实例化它们的依赖项。但是' makeDefault' TyphoonComponentFactory的方法包装在dispatch_once块中,这意味着它只能在应用程序的生命周期内发生一次。
为什么呢?是我的方法的一部分从根本上错了吗?我希望能够以某种方式在我的泪下方法中破坏台风状态,但我不知道如何 - 不能摧毁一个单身人士!
答案 0 :(得分:3)
makeDefault 方法仅用于将Typhoon集成到遗留代码中 - 不受Typhoon管理的类。我们现在不鼓励在其他地方使用它,因为它会对Typhoon造成严重依赖,这可能会导致这类问题。要嘲笑它,你需要调整。
非常常见,一个对象图加载另一个 - 例如从一个视图控制器(具有注入的依赖项)转换到另一个。从Typhoon查找依赖项的更好方法是将组件工厂注入依赖项。这可以通过以下方式完成:
Ex1:使用属性注入注入程序集
- (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的卸载方法来卸载单例范围的组件,但在正常使用情况下不应该这样做。
<强>更新强>
除了我们现在已经多次设置默认工厂的限制外,上述所有内容仍适用。这现在只是发出警告。