2017-02-04 18 views
1

У меня есть приложение, содержащее cocoapod, содержащий движок за приложением. В этом cocoapod у меня есть общий экземпляр базового класса.`Синхронизированный` не работает в XCTest

+ (Restaurant *)current { 
    @synchronized(self) { 
     if (current == nil) { 
      current = [[Restaurant alloc] initWithId:0]; 
     } 
    } 
    return current; 
} 

Теперь у меня есть некоторые unittests в другом коде в моем приложении. Это выглядит следующим образом:

- (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: logs a 4), он возвращает 0. Is @synchronized несовместим с Xcode unittests? Или кто-нибудь знает, что еще здесь происходит?

ответ

0

компания Apple рекомендует использовать dispatch_once вместо синхронизируется так что вы можете попробовать этот код:

+ (Restaurant *)current { 
    static Restaurant *current=nil: 
    static dispatch_once_t onceToken = 0; 
    dispatch_once(&onceToken, ^{ 
     current = [[Restaurant alloc] initWithId:0]; 
    } 
    return current; 
} 

Ссылка на яблоко документации: https://developer.apple.com/reference/dispatch/1447169-dispatch_once

0

mainTable не является объектом, поэтому не вызывайте XCTAssertEqualObjects. Вместо этого используйте XCTAssertEquals.