Как провести модульное тестирование CloudKit / Core Data? - PullRequest
0 голосов
/ 16 апреля 2020

У меня возникли проблемы с выяснением того, как создавать макеты / заглушки для CloudKit и Core Data.


Я сделал некоторый прогресс с моим сервисным слоем CloudKit, введя база данных, которая соответствует протоколу, который я написал, который по существу переопределяет функции CKDatabase.

/// A protocol to allow mocking a CKDatabase.
protocol CKDatabaseProtocol {
    func add(_ operation: CKDatabaseOperation)
    func delete(withRecordID recordID: CKRecord.ID, completionHandler: @escaping (CKRecord.ID?, Error?) -> Void)
    func fetch(withRecordID recordID: CKRecord.ID, completionHandler: @escaping (CKRecord?, Error?) -> Void)
    func perform(_ query: CKQuery, inZoneWith zoneID: CKRecordZone.ID?, completionHandler: @escaping ([CKRecord]?, Error?) -> Void)
    func save(_ record: CKRecord, completionHandler: @escaping (CKRecord?, Error?) -> Void)
}

extension CKDatabase: CKDatabaseProtocol { }

С помощью этого я могу добавить действительный CKContainer.default().publicCloudDatabase в свой сервис или создать фиктивный класс, соответствующий тому же протоколу, и вставить мой MockCKDatabase в мой экземпляр службы модульных тестов. Это работает для всех функций за исключением функции add(operation). Я не уверен, как добавить CKQueryOperation к моим MockCKDatabase, чтобы сработали его блоки завершения.


Для части Core Data я использую новый NSPersistentCloudKitContainer для синхронизации c личная база данных пользователя (при использовании моего сервиса CloudKit для запросов к моей базе данных publi c). Я нашел отличный блог о создании стека базовых данных, который позволяет вводить тип хранилища при настройке стека, чтобы вы могли использовать NSSQLiteStoreType в производстве и NSInMemoryStoreType в тестировании.

Однако, когда я пытаюсь использовать решение в памяти, я получаю следующую ошибку:

«NSLocalizedFailureReason»: «Интеграция CloudKit поддерживается только для хранилищ SQLite.»

Есть ли лучшее решение для тестирования CloudKit / Core Data? Мне бы очень хотелось, чтобы мои сервисные уровни были тщательно протестированы.

...