2016-04-29 19 views
3

Ich habe eine einfache RxSwift Observable-Sequenz, die ich versuche, Unit-Test.RxSwift Unit Testing

var pass = false 
    _ = service!.authenticate().subscribeNext { res in 
     XCTAssert(res.tokenValue == "abc123") 
     pass = true 
    } 
    XCTAssertTrue(pass) 

Dieser Test wird zeitweise fehlschlagen, als ob der subscribeNext Block nicht immer getroffen wird. Irgendwelche Ideen, was ich falsch mache?

bearbeiten 1

Dieser beglaubigen Anruf einfach zurückgibt statische Daten JSON und tatsächlich ist das Netz nicht zu schlagen.

Antwort

8

Ihr Problem ist höchstwahrscheinlich aufgrund entweder einer dieser beiden Fragen:

  1. Der Test schlägt das Netzwerk
  2. Der Test in einer synchronen Art und Weise geschrieben, aber das getestete Verhalten ist asynchron.

Schlagen In Bezug auf das Netzwerk in Ihren Tests: Dies ist generell eine schlechte Idee, es sei denn, Sie Integrationstests tun. Das Netzwerk ist unzuverlässig, es kann Timeouts oder Fehler geben. Sie können weitere Informationen darüber finden, warum das Aufsetzen des Netzwerks in Ihrem Test keine gute Idee ist here.

In Bezug auf asynchrone Tests: Was passiert ist, dass Ihre Behauptung durch den Test vor das nächste Ereignis gesendet wird durch die beobachtbaren ausgeführt wird.

Sie könnten Ihren Test wie folgt umschreiben:

let service = Someservice()

let expectation = expectationWithDescription("subscribeNext called") 

_ = service!.authenticate().subscribeNext { res in 
    XCTAssert(res.tokenValue == "abc123") 
    expectation.fulfill() 
} 

waitForExpectationsWithTimeout(1) { error in 
    if let error = error { 
    XCTFail("waitForExpectationsWithTimeout errored: \(error)") 
    } 
} 

Sie weitere Informationen here auf asynchrone Tests finden.

+0

Danke für die Antwort. Ich habe vergessen zu erwähnen, dass es mit Scheindaten arbeitet, so dass es keinen tatsächlichen Netzwerkanruf gibt. Ich habe gerade diesen Ansatz von waitForExpectation ausprobiert und es sieht so aus, als ob es manchmal überhaupt nicht getroffen wird. Ich werde weiter suchen. Danke noch einmal. – dloomb