ron*_*ory 2 unit-testing xctest swift alamofire swift3
我正在尝试编写单元测试,目前我尝试测试接收数据的 viewController viewDidLoad(),数据是在 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
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)
}
}
Run Code Online (Sandbox Code Playgroud)
为什么第二个断言失败?
在第二个断言中,您期望异步加载数据,但是您同步检查它们,并且在检查它们时,网络操作尚未完成,因此当然会失败。
在 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)
Run Code Online (Sandbox Code Playgroud)
另外要指出的是,测试网络操作并等待响应是一种不好的做法,您应该拦截网络请求并返回本地数据,而不是等待来自服务器的真实数据。(在 GitHub 上有一个很好的框架可以在 Swift 中做到这一点:OHHTTPStubs)
| 归档时间: |
|
| 查看次数: |
818 次 |
| 最近记录: |