У меня возникли проблемы с выяснением того, как создавать макеты / заглушки для 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? Мне бы очень хотелось, чтобы мои сервисные уровни были тщательно протестированы.