为什么我不能在Typhoon中多次设置默认工厂?

时间:2014-03-15 03:33:40

标签: objective-c unit-testing typhoon

在我的单元测试中,我使用Typoon和TyphoonBlockComponentFactory对象来实例化模拟和对象,等等。我的所有单元测试按顺序运行,并且每个单元测试都只设置自己需要运行的组件。

它创建该工厂并使其每次都成为默认工厂,因此被测试的类可以从工厂实例化它们的依赖项。但是' makeDefault' TyphoonComponentFactory的方法包装在dispatch_once块中,这意味着它只能在应用程序的生命周期内发生一次。

为什么呢?是我的方法的一部分从根本上错了吗?我希望能够以某种方式在我的泪下方法中破坏台风状态,但我不知道如何 - 不能摧毁一个单身人士!

1 个答案:

答案 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的卸载方法来卸载单例范围的组件,但在正常使用情况下不应该这样做。

<强>更新

除了我们现在已经多次设置默认工厂的限制外,上述所有内容仍适用。这现在只是发出警告。