我们正在我们的应用程序中实现“同步到日历”功能。我们的同步过程涉及我们从服务器端获取的事件,我们希望将这些事件复制到 iPhone 日历。目前我不确定我们为此同步编写的方法是否解决了我们期望的所有可能场景,这就是我想要对其进行单元测试的原因。它包含对 EKEventStore 的大量调用,正如 Apple 文档所述,需要首先使用 requestAccessToEntityType:completion:
调用:
On iOS 6 and later, you must request access to an entity type after the event store is initialized with requestAccessToEntityType:completion: for data to return.
...这将很难在我们运行单元测试的环境中处理。
目前我正在考虑实现 EKEventStore 的模拟子类,并在其后面使用一些 NSArray 的 EKEvent 对象。
是否可以在不编写模拟我们在同步例程中使用的所有方法的模拟子类的情况下针对 EKEventStore 进行单元测试?
最佳答案
最近我发现最终可以在模拟器中使用特殊的 hack 来做到这一点:TCC.db
数据库存储了这个和其他一些访问权限。
我能够设置我的单元测试套件,以便在它启动时使用与 EKAuthorizationStatusAuthorized
相对应的值修改此 TCC.db
表。完成此更改后,可以使用对 EKEventStore
的完全访问权限编写所有后续测试。
首先,这里有一些解释:Grant access to NAB programatically on iOS 7.0 Simulator .
还有不错的项目JPSimulatorHacks其中包含包装此 hack 的代码。它确实支持向日历授予权限。
现在我可以对我的日历同步代码进行单元测试,而无需对 EK 类进行详尽的 stub 。
重要细节:
无法访问 TCC.db
至少当您的测试目标未指向 Host Application
中的实际应用程序时我没有找到它。当我确实将 Host Application
设置为 None
时,我无法找到 TCC.db
,因此无法授予任何权限。这就是为什么我目前为我的单元测试目标创建了人工应用程序 MyAppNameTestsApp 所以现在我将我的单元测试目标的 Host Application
设置为 MyAppNameTestsApp
。这为我提供了带有 TCC.db
的有效应用程序,同时不需要我在运行 Cmd+U
时加载整个应用程序。
关于ios - 是否有机会针对 EKEventStore 编写单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25410129/