2016-01-28 10 views
5

Basierend auf Antworten auf this question, ich fühle mich mit der Einfachheit und Benutzerfreundlichkeit der folgenden zwei Methoden zur Synchronisation glücklich:Wie können diese Synchronisationsmethoden effektiv Unit-getestet werden?

func synchronized(lock: AnyObject, closure:() -> Void) { 
    objc_sync_enter(lock) 
    closure() 
    objc_sync_exit(lock) 
} 

func synchronized<T>(lock: AnyObject, closure:() -> T) -> T { 
    objc_sync_enter(lock) 
    defer { objc_sync_exit(lock) } 
    return closure() 
} 

Aber um sicherzustellen, dass sie tatsächlich tun, was ich will, ich will wrap diese in Stapeln von Unit-Tests. Wie kann ich Komponententests schreiben, die diese Methoden effektiv testen (und zeigen, dass sie tatsächlich den Code synchronisieren)?

Idealerweise möchte ich auch, dass diese Komponententests so einfach und klar wie möglich sind. Vermutlich sollte dieser Test ein Code sein, der, wenn er außerhalb des Synchronisationsblocks ausgeführt wird, eine Reihe von Ergebnissen liefert, aber innerhalb dieser synchronisierten Blöcke einen völlig separaten Satz von Ergebnissen ergibt.

+0

Versuchen Sie, einen Test zu schreiben, zu testen, ob der synchronisierten Block im allgemeinen Fall synchronisiert, oder versuchen Sie, zu überprüfen, ob Ihr Code, der auf dem synchronisierten Block setzt synchronisiert werden? –

+0

@ WillM.Ich interessiere mich für den allgemeinen Fall. Ich möchte einen Komponententest, der überprüft, ob es einen durchlaufenden Code synchronisiert. – nhgrif

+0

Ok, ich warf etwas zusammen, das sollte das demonstrieren. –

Antwort

1

Hier ist ein ausführbarer XCTest, der die Synchronisation überprüft. Wenn Sie delayedAddToArray synchronisieren, wird es funktionieren, andernfalls wird es fehlschlagen.

class DelayedArray:NSObject { 
    func synchronized(lock: AnyObject, closure:() -> Void) { 
     objc_sync_enter(lock) 
     closure() 
     objc_sync_exit(lock) 
    } 

    private var array = [String]() 
    func delayedAddToArray(expectation:XCTestExpectation) { 
     synchronized(self) { 
      let arrayCount = self.array.count 
      self.array.append("hi") 
      sleep(5) 
      XCTAssert(self.array.count == arrayCount + 1) 
      expectation.fulfill() 
     } 
    } 
} 

func testExample() { 
    let expectation = self.expectationWithDescription("desc") 
    let expectation2 = self.expectationWithDescription("desc2") 

    let delayedArray:DelayedArray = DelayedArray() 
    // This is an example of a functional test case. 
    let thread = NSThread(target: delayedArray, selector: "delayedAddToArray:", object: expectation) 
    let secondThread = NSThread(target: delayedArray, selector: "delayedAddToArray:", object: expectation2) 
    thread.start() 
    sleep(1) 
    secondThread.start() 

    self.waitForExpectationsWithTimeout(15, handler: nil) 
} 
Verwandte Themen