我有一个类,我在其中调用异步方法并从属性分配值,并在单元测试中测试属性,但我的属性结果始终为 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的值
最佳答案
where I call an async method
您的问题可能是由于您正在以同步方式测试异步操作的结果。
您的 XCTAssertTrue
在调用 .fetchCurrentExchangeRates()
之后立即执行,但由于正如您所说,该方法执行异步操作,因此在调用之前评估断言fetch 完成,因此它读取初始值。
您可以使用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这是一个强大的匹配器库,具有更好的异步测试语法。
关于ios - 单元测试中的属性为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38473362/