在运行单元测试时,objective-c中的单例不会重置

时间:2014-11-13 22:43:43

标签: objective-c unit-testing

在我的应用程序中,我有一个单例类。这样实现:

@implementation PTKRGlobal
static PTKRGlobal *instance = nil;

+(PTKRGlobal *)shared
{
    @synchronized(self)
    {
        if(instance==nil)
        {
            instance= [PTKRGlobal new];
        }
    }
    return instance;
}

此类的头文件具有各种单例属性,如codedatamanager:

@interface PTKRGlobal : NSObject
+(PTKRGlobal *)shared;
@property (strong, nonatomic) PTKRCoraDataManager *coreDataManger;

这允许我使用以下方式致电经理:

[[PTKRGlobal shared] coreDataManager]

在appdeleget中我设置了经理:

[[PTKRGlobal shared] setCoreDataManger:[PTKRCoraDataManager new]];

运行单元测试时,我有一个带有一些差异的子类PTKRCoreDataManager。然而,当我尝试在单元测试[[PTKRGlobal shared] setCoreDataManger:[PTKRTestCoreDataManager new]];中设置核心数据管理器时,我发现该变量已经设置并且不允许重新分配。 可以推测PTKRGlobal是在我认为运行单元测试之前运行的功能测试运行期间创建的。我通过在app委托中放置一个断点并在单元测试setUp中放置一个断点并比较输出os po [[PTKRGlobal shared] coreDataManager]

来验证这一点

如何在单元测试开始前重置此单例?

1 个答案:

答案 0 :(得分:1)

向班级添加方法:

+ (void)destroySingleton {
    instance = nil;
}

并在单元测试的tearDown方法中调用它。

- (void)tearDown {
     [PTKRGlobal destroySingleton];
     [super tearDown];
}

请注意,您可能不希望在实际应用中公开显示此内容,因此只需在.m文件中添加此方法即可。

然后在单元测试的.m中,在单元测试的@implementation之上,添加以下内容:

@interface PTKRGlobal (UnitTesting)
+ (void)destroySingleton
@end