目标 C语言 为什么我不能多次设置台风的默认工厂?



在我的单元测试中,我使用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方法来卸载你的单例作用域组件,但在正常使用下不应该这样做。

更新:

上述所有内容仍然适用,除了我们现在移动了多次设置默认工厂的限制。这现在只是触发一个警告。

最新更新