gpt4 book ai didi

swift - 在 Swift 中对 HKSampleQuery 进行单元测试

转载 作者:搜寻专家 更新时间:2023-10-31 19:30:32 25 4
gpt4 key购买 nike

当我需要从 HealthKit 读取数据时,我的代码是这样的:

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)

此特定代码提取自 here用于演示目的。

所以我的问题是:

How can I unit test this kind of code ?

最佳答案

我将此代码封装在模型类中的一个函数中,该模型类对 UI 一无所知。它是这样工作的:

在你有你的地方

// Update some UI

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

你可以像这样从你的 Controller 类中调用这个函数

hkModel.selectSteps() {
[unowned self] (query, results, error) in
// update UI
}

这样您就可以清楚地分离模型类中的查询逻辑和 UIController 代码。

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

func testSteps() {
hkModel.selectSteps() {
[unowned self] (query, results, error) in
// XCTAssert(...)
}
}

您需要做的最后一件事是尊重您的测试代码是异步调用的:

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)
}
}

更新

因为你问:

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

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)
}
}
}

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

第一次运行后,测试无需人工干预即可运行。

关于swift - 在 Swift 中对 HKSampleQuery 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34023444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com