我正在为模型类编写一些单元测试代码,并希望在app退出和重新启动期间模拟类的行为。我可以通过删除和重新分配对象来实现这一点,但是它是一个单例,因此下面的代码没有达到预期的效果:
+ (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
是否有一个简洁的解决方案,所以我可以删除/重新创建对象?
答案 0 :(得分: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];
答案 1 :(得分:1)
确保这样的事情对于单元测试来说没问题,你可以将它关闭为prod:
static MyModel *singleton = nil;
+ (id) sharedInstance
{
if(!singleton)
{
singleton = [self new];
}
return singleton;
}
+ (void)resetSingleton
{
[singlelton release];
singleton = nil;
}