我有一个应用程序,其中包含一个包含应用程序背后的引擎的cocoapod。在这个cocoapod中,我有一个基本类的共享实例。
+ (Restaurant *)current {
@synchronized(self) {
if (current == nil) {
current = [[Restaurant alloc] initWithId:0];
}
}
return current;
}
现在,我在我的应用中运行了一些其他代码的单元测试。看起来像这样:
- (void)testPOSTCodeGeneration {
[[Restaurant current] setMainTable:4];
NSLog(@"Main table in test: %d", [[Restaurant current] mainTable]);
Generator *generator = [[Generator alloc] init];
XCTAssertEqualObjects([[Restaurant current] mainTable], generator.table);
}
在Generator.m
中,我做了一些事情:
- (void)init {
...
self.table = [[Restaurant current] mainTable];
...
}
奇怪的是,这个测试失败了。除非设置了不同的数字,否则mainTable
的默认值为0。因此,即使我将其设置为4(并且Main table in test:
记录为4),它也会返回0. @synchronized
是否与Xcode单元测试不兼容?或者有谁知道这里还有什么?
答案 0 :(得分:0)
$_POST['password']
不是对象,因此请勿调用mainTable
。而是使用XCTAssertEqualObjects
。
答案 1 :(得分:0)
Apple建议使用dispatch_once而不是synchronized,所以你可以尝试这段代码:
+ (Restaurant *)current {
static Restaurant *current=nil:
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
current = [[Restaurant alloc] initWithId:0];
}
return current;
}
链接到Apple文档:https://developer.apple.com/reference/dispatch/1447169-dispatch_once