单位测试中的属性为零

时间:2016-07-20 05:59:13

标签: ios swift unit-testing

我有一个类,我调用异步方法并从属性中赋值,并在单元测试中测试属性,但我的属性总是为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

的值

1 个答案:

答案 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这是一个功能强大的匹配器库,它具有更好的异步测试语法。

我还建议avoid hitting the network in your unit tests