Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么可以';我是否多次在台风中设置默认工厂?_Objective C_Unit Testing_Typhoon - Fatal编程技术网

Objective c 为什么可以';我是否多次在台风中设置默认工厂?

Objective c 为什么可以';我是否多次在台风中设置默认工厂?,objective-c,unit-testing,typhoon,Objective C,Unit Testing,Typhoon,在我的单元测试中,我使用Typoon和TyphonBlockComponentFactory对象来实例化模拟和对象等等。我的所有单元测试都会按顺序同时运行,并且每个单元测试都只使用需要运行的程序集建立自己的工厂 它创建该工厂并使其每次都成为默认工厂,因此被测试的类可以从工厂实例化它们的依赖项。但TyphonComponentFactory的“makeDefault”方法被包装在一个dispatch_once块中,这意味着它在应用程序的生命周期中只能发生一次 为什么??我的方法有一部分根本错误吗?

在我的单元测试中,我使用Typoon和TyphonBlockComponentFactory对象来实例化模拟和对象等等。我的所有单元测试都会按顺序同时运行,并且每个单元测试都只使用需要运行的程序集建立自己的工厂

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

为什么??我的方法有一部分根本错误吗?我希望能够用我的撕裂方法摧毁台风状态,但我不知道如何-不能摧毁一个单身汉

makeDefault方法仅用于将Typhone集成到不是由Typhone管理的遗留代码类中。我们现在不鼓励在其他地方使用它,因为它会造成对台风的严重依赖,这可能导致此类问题。要模仿它,你需要大口大口地喝

一个对象图加载另一个对象图是很常见的,例如从一个视图控制器(具有注入的依赖项)转换到另一个视图控制器。从Typhone中查找依赖项的更好方法是将组件工厂作为依赖项注入。这可以通过以下方式完成:

  • 让你的班级遵守
  • 注入程序集,例如:
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方法卸载Singleton作用域的组件,但在正常使用情况下不需要这样做

更新:


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

这很有道理,谢谢。两个问题:1。这难道不会导致大量样板代码,因为每个类都必须有一个与之关联的工厂吗?2.我曾认为,使用“defaultFactory”是一种偷偷绕过单件禁令的方法——因此,需要保持状态并在全球范围内可用的对象可以简单地存在于台风工厂内——有没有更好的方法,台风可以代替这一方法?我是否将它们连接到AppDelegate并将它们留在那里?没有那么多样板文件。1.添加与程序集类型匹配的属性。b) 告诉台风给它注射。目前无法避免这两行代码。但这仍然建议不要使用defaultFactory。