簡體   English   中英

在viewDidLoad之后未在測試中設置XCTest單元測試數據響應

[英]XCTest Unit Test data response not set in test after viewDidLoad

我正在嘗試編寫單元測試,當前正在嘗試測試在viewDidLoad()接收到數據的viewController,該數據是在alamofire請求之后設置的。 問題是,在我的測試函數中,當我檢查成功請求后應以10個元素填充的數組時,其值為0。我檢查了測試中的viewDidLoad()是否未執行,但應該執行,因為當我只是將元素添加到請求之外的另一個數組中時,特定的測試有效。 我想這與請求有關,到目前為止我還沒有找到答案。

這是代碼( 帶有解釋的問題 ,幫助我執行了viewController的viewDidLoad()):

ViewController 簡化了

class ViewController: UIViewController {

  var itemsFromRequest: [Int] = []
  var itemsWithoutRequest: [Int] = []

  override func viewDidLoad() {
    super.viewDidLoad()

    // array with 10 elements
    itemsWithoutRequest = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    Alamofire.request(url: URLConvertible).responseJSON { response in
      //...error handling, parsing etc.

      // set array after successful response
      self.itemsFromRequest = responseData
    }
  }
}

ViewControllerTests類:

class ViewControllerTests: XCTestCase {

  var viewController: ViewController!

  override func setUp() {
    super.setUp()

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    viewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
    // trigger viewDidLoad() of viewController
    let _ = viewController.view
  }

  func testItemArraysHaveTenItems() {
    // This is successful
    XCTAssertEqual(viewController.itemsWithoutRequest.count, 10)
    // This failed with error "XCTAssertEqual failed: ("0") is not equal to ("10")"
    XCTAssertEqual(viewController.itemsFromRequest.count, 10)
  }
}

為什么第二個斷言失敗了?

問題

在第二個斷言中,您期望數據被異步加載,但是您需要同步檢查它們,並且在檢查它們時,網絡操作尚未完成,因此當然會失敗。

在iOS上,可以使用XCTestExpectation進行異步測試。

使用例

let testExpectation = expectation(description: "Asynchronous expectation")
let sut = SubjectUnderTest()

sut.executeAsynchronousOperation(completion: { (error, data) in
    XCTAssertTrue(error == nil)
    XCTAssertTrue(data != nil)

    testExpectation.fulfill()
})

waitForExpectations(timeout: 5, handler: .none)

提示

要指出的另一件事是,測試網絡操作並等待響應是一種不好的做法,您應該攔截網絡請求並返回本地數據,而不是等待服務器的真實數據。 (在GitHub上有一個不錯的框架可以在Swift中做到這一點: OHHTTPStubs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM