Можем ли мы программно войти в CloudKit для модульного тестирования? Это нецелесообразно, потому что даже если бы мы могли, тесты были бы медленными и хрупкими. Вместо этого рассматривайте CloudKit как архитектурную границу. Модульные тесты могут идти прямо до этой границы. И мы можем притворяться, что вещи возвращаются с границы. Таким образом, мы можем проверить все пути.
Для программирования этой границы в вашем коде используйте протокол. Этот протокол будет слайсом, содержащим только те методы CKContainer, которые вы хотите. (Это принцип разделения интерфейса в действии.) Поскольку CKContainer уже реализует этот метод, мы можем присоединить его как пустое расширение.
protocol CKContainerProtocol {
func accountStatus(completionHandler: @escaping (CKAccountStatus, Error?) -> Void)
}
extension CKContainer: CKContainerProtocol {}
Затем добавьте свойство к вашей модели представления:
var cloudKitContainer: CKContainerProtocol = CKContainer.default()
Значение по умолчанию означает, что ваш код будет продолжать использовать настоящий CKContainer, если не указано иное. Измените свой код так, чтобы звонить cloudKitContainer
вместо CKContainer.default()
.
Затем в тестовом коде вы можете предоставить другую реализацию CKContainerProtocol. Это позволит вам делать заглушки и насмешки. Вы можете подтвердить, что accountStatus()
вызывается ровно один раз. И вы можете использовать его замыкание с разными значениями CKAccountStatus, чтобы подтвердить, как вызывается ваше завершение Завершения.
(Подобные вещи будут подробно рассмотрены в книге по модульному тестированию iOS , которую я сейчас пишу .)