Есть ли шанс написать модульные тесты для EKEventStore?

Мы реализуем функцию «Синхронизировать с календарем» в нашем приложении. Наш процесс синхронизации включает в себя события, которые мы получаем со стороны сервера, которые мы хотим воспроизвести в календаре iPhone. В настоящее время я не уверен, что метод, который мы написали для этой синхронизации, учитывает все возможные сценарии, которые мы ожидаем иметь, поэтому я хочу провести его модульное тестирование. Он содержит многочисленные вызовы EKEventStore, которые, как указано в документации Apple, сначала необходимо вызывать с помощью requestAccessToEntityType:completion::

В iOS 6 и более поздних версиях вы должны запросить доступ к типу сущности после инициализации хранилища событий с помощью requestAccessToEntityType:completion: для возврата данных.

... с которыми будет сложно справиться в среде, в которой выполняются наши модульные тесты.

В настоящее время я думаю о реализации фиктивного подкласса EKEventStore с некоторыми объектами NSArray EKEvent за ним.

Есть ли возможность провести модульное тестирование EKEventStore без написания такого фиктивного подкласса, который имитировал бы все методы, которые мы используем внутри нашей процедуры синхронизации?


person Stanislav Pankevich    schedule 20.08.2014    source источник


Ответы (1)


Недавно я обнаружил, что это наконец-то можно сделать в Симуляторе с помощью специального хака: есть TCC.db база данных, в которой хранятся это и некоторые другие права доступа.

Я смог настроить свой набор модульных тестов так, чтобы при запуске эта таблица TCC.db изменялась со значением, соответствующим EKAuthorizationStatusAuthorized. После внесения этого изменения все последующие тесты могут быть написаны с полным доступом к EKEventStore.

Прежде всего, здесь есть небольшое пояснение: Предоставить доступ для NAB программно на симуляторе iOS 7.0.

Также есть хороший проект JPSimulatorHacks, который содержит код, оборачивающий этот хак. Он поддерживает предоставление разрешений для Календаря.

Теперь я могу выполнить модульное тестирование кода синхронизации календаря без исчерпывающей заглушки EK-классов.

Важная деталь:

Доступа к TCC.db нет, по крайней мере я не нашел, когда ваша тестовая цель не указывает на реальное приложение в Host Application. Когда я установил Host Application на None, я не смог найти TCC.db и, следовательно, что-либо предоставить. Вот почему в настоящее время для моей цели модульных тестов я создал искусственное приложение MyAppNameTestsApp, поэтому теперь я установил цель моего модульного теста Host Application на MyAppNameTestsApp. Это дает мне действительное приложение с TCC.db и в то же время не требует загрузки всего приложения при запуске Cmd+U.

person Stanislav Pankevich    schedule 25.01.2015