2017-02-04 2 views
1

Ich habe eine App, die eine Cocoapod enthält, die die Engine hinter der App enthält. In diesem Cocoapod habe ich eine gemeinsame Instanz der Basisklasse.`Synchronisiert` funktioniert nicht in XCTest

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

Nun, ich habe ein paar Untestests auf anderen Code in meiner App. Das sieht wie folgt aus:

- (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); 
} 

Und in Generator.m, das tue ich etwas entlang der Linien von dieser:

- (void)init { 
    ... 
    self.table = [[Restaurant current] mainTable]; 
    ... 
} 

Das Merkwürdige ist, dass dieser Test fehlschlägt. mainTable hat den Standardwert 0, sofern keine andere Nummer festgelegt wurde. Also, obwohl ich es auf 4 (und Main table in test: logs a 4) setzt, gibt es 0 zurück. Ist @synchronized inkompatibel mit Xcode Unit Tests? Oder weiß jemand was noch hier los ist?

Antwort

0

Apple empfiehlt dispatch_once zu verwenden, anstatt synchronisiert, so können Sie diesen Code versuchen:

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

Link zu Apple-Dokumentation: https://developer.apple.com/reference/dispatch/1447169-dispatch_once

0

mainTable ist kein Objekt, also rufen Sie nicht XCTAssertEqualObjects. Verwenden Sie stattdessen XCTAssertEquals.