gpt4 book ai didi

swift - viewDidLoad 后未在测试中设置 XCTest 单元测试数据响应

转载 作者:可可西里 更新时间:2023-11-01 00:49:58 24 4
gpt4 key购买 nike

我正在尝试编写单元测试,目前我正在尝试测试在 viewDidLoad() 中接收数据的 viewController,数据是在 alamofire 请求后设置的。问题是,在我的测试函数中,当我检查成功请求后应该填充 10 个元素的数组时,它是 0。我检查了测试中的 viewDidLoad() 是否未执行,但它应该是,因为当我只是将元素添加到请求之外的另一个数组时,特定测试有效。我想,这与请求有关,到目前为止我还没有找到答案。

这是代码(这个 question with explanation 帮助我执行了 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)
}
}

为什么第二个Assertion会失败?

最佳答案

问题

在第二个断言中,您期望异步加载的数据,但您同步检查它们并且在检查它们时,网络操作尚未完成,因此它当然会失败。

解决方案

在 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)

关于swift - viewDidLoad 后未在测试中设置 XCTest 单元测试数据响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40201617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com