`Synchronized`在XCTest中不起作用

时间:2017-02-04 20:10:35

标签: objective-c xcode xctest

我有一个应用程序,其中包含一个包含应用程序背后的引擎的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单元测试不兼容?或者有谁知道这里还有什么?

2 个答案:

答案 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