1

我正在为模型类编写一些单元测试代码,并希望在应用退出和重新启动期间模拟类的行为。我可以通过删除和重新分配对象来实现这一点,但是它是一个单例,因此下面的代码没有达到预期的效果:

+ (id) sharedInstance
{
    static MyModel *singleton = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^ {
        singleton = [[MyModel alloc] initSharedInstance];
    });
    return singleton;
}


// Test code:
    MyModel* gModel = [MyModel sharedInstance];
    ... tests
    gModel = nil;
    gModel = [MyModel sharedInstance];
    ... more tests

是否有一个简洁的解决方案,以便我可以删除/重新创建对象?

4

2 回答 2

2
static MyModel *singleton = nil;
static dispatch_once_t onceToken;

+ (instancetype) sharedInstance
{
    dispatch_once(&onceToken, ^ {
        if (singleton==nil){
            singleton = [[MyModel alloc] initSharedInstance];
        }
    });
    return singleton;
}

+(void)setSharedInstance:(MyModel *)instance {
    onceToken = 0;
    singleton = instance;
}

无它:

[MyModel setSharedInstance:nil];

请注意,您还可以将其设置为任意类来模拟它。

[MyModel setSharedInstance:someMock];
于 2013-05-10T22:11:41.327 回答
1

确定这样的东西对于单元测试来说很好,你可以将其关闭以进行生产:

static MyModel *singleton = nil;

+ (id) sharedInstance
{   
   if(!singleton)
    {
        singleton = [self new];
    }
    return singleton;
}
+ (void)resetSingleton
{
    [singlelton release];
    singleton = nil;
}
于 2013-05-10T22:03:10.533 回答