gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:09:11 25 4
gpt4 key购买 nike

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

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

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

最佳答案

makeDefault 方法仅用于将 Typhoon 集成到遗留代码中 - 不受 Typhoon 管理的类。我们现在不鼓励在其他地方使用它,因为它会产生对 Typhoon 的紧密依赖,这可能会导致此类问题。要模拟它,您需要调配。

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

Ex1:使用属性注入(inject)注入(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 的卸载方法来卸载您的单例范围组件,但在正常使用情况下不需要这样做。

更新:

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

关于objective-c - 为什么我不能多次在 Typhoon 中设置默认工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22419185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com