首页 > 解决方案 > CloudKit 单元测试查询未执行

问题描述

我正在尝试为 CloudKit 编写测试,我正在覆盖我想测试和扩展的方法,以便模拟我的CloudKitCKDatabase数据库,从我可以从其他帖子中确定的内容(链接1链接2 - 谢谢)这是必要的测试 CloudKit。

我没有测试和尝试学习的经验,所以我觉得我可能错过了更大的图景,打印语句永远不会打印,表明关闭永远不会执行。有人可以指出我正确的方向吗?


这是我的简化代码-

CloudKitService.swift

protocol CKDatabaseProtocol {
    func perform(_ query: CKQuery, inZoneWith zoneID: CKRecordZone.ID?, completionHandler: @escaping ([CKRecord]?, Error?) -> Void)
}

extension CKDatabase: CKDatabaseProtocol { }

CloudKitTests.swift

class MockCloudKit: CKDatabaseProtocol {

    private let container: CKContainer

    fileprivate var database: CKDatabase {
        return self.container.publicCloudDatabase
    }

    init(container: CKContainer) {
        self.container = container
    }

    func perform(_ query: CKQuery, inZoneWith zoneID: CKRecordZone.ID?, completionHandler: @escaping ([CKRecord]?, Error?) -> Void) {
        self.database.perform(query, inZoneWith: zoneID, completionHandler: completionHandler)
    }

    func getData(dataFetched: @escaping([CKRecord]) -> (Void)) {    
        let predicate = NSPredicate(value: true)
        let publicQuery = CKQuery(recordType: "MyRecord", predicate: predicate)
        publicQuery.sortDescriptors = [NSSortDescriptor(key: "id", ascending: true)]

        perform(publicQuery, inZoneWith: .default) { results, error in
            dataFetched([CKRecord]())
            // no execution here
            print("This is never printed")
                ...
        }
    }
}

class CloudKitTest: XCTestCase {

    func myTest() {
        var record = [CKRecord]()
        let container = CKContainer.default()
        let mockContainer = MockCloudKit(container: container)

        mockContainer.getData( dataFetched: { results in
             // no execution here
             print("This is never printed")
             ....
        }
    }
}

标签: swiftunit-testingcloudkit

解决方案


推荐阅读