2016-04-29 67 views
3

我有一個簡單的RxSwift Observable序列,我試圖單元測試。RxSwift單元測試

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

該測試將間歇性地失敗,就好像subscribeNext塊不總是被命中一樣。關於我在做什麼的任何想法都是錯誤的?

編輯1

此身份驗證調用只是返回靜態JSON數據並沒有實際接觸網絡。

回答

8

你的問題很可能是由於這兩個問題一方:

  1. 測試打網絡
  2. 測試是寫在一個同步的方式,但測試的行爲是異步的。

關於在您的測試中擊中網絡:這通常是一個壞主意,除非您正在進行集成測試。網絡不可靠,可能會超時或失敗。你可以找到更多的信息,爲什麼擊中你的測試網絡不是一個好主意here

關於異步測試:正在發生的事情是,你的主張是由測試下一個事件被觀察到的發送之前執行。

你可以重寫你的測試是這樣的:

let服務= 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)") 
    } 
} 

你可以找到關於異步測試here更多信息。

+0

感謝您的回覆。我忘了提及它使用模擬數據,所以沒有實際的網絡調用。我只是嘗試了waitForExpectation方法,它看起來像它有時根本不會被擊中。我會繼續尋找。再次感謝。 – dloomb