我有一个类,我调用异步方法并从属性中赋值,并在单元测试中测试属性,但我的属性总是为0,即使属性有值。
class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource {
var exchangeRates = [:]
var currencies = []
var baseExchangeName = ""
var exchangeFromName : "USD"
var exchangeToName = "USD"
func fetchCurrentExchangeRates() {
do some thing//
exchange rates = ...
}
}
unit test
func testFetchCurrentExchangeRates() {
let exchangeView = ViewController()
exchangeView.fetchCurrentExchangeRates()
print(exchangeView.exchangeRates.allKeys.count)
it returns always 0
//XCTAssertTrue(exchangeView.exchangeRates.allKeys.count > 0, "passed\(exchangeView.exchangeRates.allKeys.count)")
}
我可以知道如何访问exchangeView.exchangeRates.allKeys.count
的值答案 0 :(得分:0)
我称之为异步方法
您的问题可能是因为您正在以同步方式测试异步操作的结果。
在调用XCTAssertTrue
之后立即执行.fetchCurrentExchangeRates()
,但是正如您所说的那样,该方法执行异步操作,在获取完成之前评估断言,所以它读取初始值。
您可以使用XCTestExpectation
来测试异步代码。
在您的情况下,您可以使用expectationForPredicate
:
// 1. Setup your expectation
let predicate = NSPredicate { input, _ in
guard let viewController = input as? ViewController else {
return false
}
return viewController.exchangeRates.allKeys.count > 0
}
self.expectationForPredicate(predicate, evaluatedWithObject: exchangeView, handler: nil)
// 2. Exercise the code under test
exchangeView.fetchCurrentExchangeRates()
// 3. Wait for the expectation to fulfil
self.waitForExpectationsWithTimeout(5, handler: nil)
我建议查看Nimble这是一个功能强大的匹配器库,它具有更好的异步测试语法。