首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中的单元测试HKSampleQuery

Swift中的单元测试HKSampleQuery
EN

Stack Overflow用户
提问于 2015-12-01 15:02:18
回答 1查看 1.2K关注 0票数 4

当我需要从HealthKit读取数据时,我的代码如下所示:

代码语言:javascript
复制
let stepsCount = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)

let stepsSampleQuery = HKSampleQuery(sampleType: stepsCount,
    predicate: nil,
    limit: 100,
    sortDescriptors: nil)
    { [unowned self] (query, results, error) in
        if let results = results as? [HKQuantitySample] {
            self.steps = results
            // Update some UI
        }
        self.activityIndicator.stopAnimating()
}

healthStore?.executeQuery(stepsSampleQuery)

这个特定的代码是为了演示目的从这里中提取的。

所以我的问题是:

如何对这种代码进行单元测试?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-01 21:49:47

我将这些代码封装在模型类中的一个函数中,这个类对UI一无所知。它的工作方式如下:

在你所拥有的地方

代码语言:javascript
复制
// Update some UI

调用一个完成闭包,该闭包使用参数传递给函数。

从控制器类调用此函数,如下所示

代码语言:javascript
复制
hkModel.selectSteps() {
    [unowned self] (query, results, error) in
    // update UI
}

这样,模型类中的查询逻辑与UIController代码之间就有了清晰的分离。

现在,您可以轻松地编写一个调用相同方法的单元测试:

代码语言:javascript
复制
func testSteps() {
    hkModel.selectSteps() {
        [unowned self] (query, results, error) in
        // XCTAssert(...)
    }
}

您最不需要的是尊重测试代码是异步调用的:

代码语言:javascript
复制
let stepExpectationEnd = expectationWithDescription("step Query")
hkModel.selectSteps() {
    [unowned self] (query, results, error) in
    // XCTAssert(...)
    stepExpectationEnd.fulfill()
}
waitForExpectationsWithTimeout(10.0) {
    (error: NSError?) in
     if let error = error {
         XCTFail(error.localizedDescription)
     }
}

更新

因为你问:

我在测试设置中处理授权。看起来是这样的:

代码语言:javascript
复制
var healthData: HealthDataManager?
override func setUp() {
    super.setUp()
    healthData = HealthDataManager()
    XCTAssert(healthData != nil, "healthDadta must be there")

    let authorizationAndAScheduleExpectation = expectationWithDescription("Wait for authorizatiion. Might be manual the first time")
    healthData?.authorizeHealthKit({ (success: Bool, error: NSError?) -> Void in
        print ("success: \(success) error \(error?.localizedDescription)")
        // fails on iPad
        XCTAssert(success, "authorization error \(error?.localizedDescription)")

        self.healthData?.scheduleAll() {
            (success:Bool, error:ErrorType?) -> Void in
            XCTAssert(success, "scheduleAll error \(error)")

            authorizationAndAScheduleExpectation.fulfill()
        }
    })
    waitForExpectationsWithTimeout(60.0) {
        error in
        if let error = error {
            XCTFail(error.localizedDescription)
        }
    }
}

第一次在模拟器中运行此代码时,必须手动批准授权。

在第一次运行之后,测试将在没有手动干预的情况下运行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34023444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档