3

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

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

为什么?我的方法的某些部分从根本上是错误的吗?我希望能够在我的 tearDown 方法中以某种方式破坏 Typhoon 状态,但我不知道如何 - 不能破坏单例!

4

1 回答 1

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

更新:

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

于 2014-03-15T04:22:33.540 回答