ios - 是否有机会针对 EKEventStore 编写单元测试?

标签 ios objective-c ekeventstore

我们正在我们的应用程序中实现“同步到日历”功能。我们的同步过程涉及我们从服务器端获取的事件,我们希望将这些事件复制到 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/

相关文章:

ios - 如何正确获取一组 EKCalendars

ios - 在uitableviewcell中隐藏空行

iphone - 在 iphone 中为固定长度的数据样本创建频谱图

ios - 在 Objective-C 中使用 InstagramKit 的问题

ios - EKEventKit - 如何在批量提交后检索 eventIdentifier?

ios - 查看 EkReminder 重复频率的最佳方式?

iphone - 在第三方应用程序中显示存折中的现有通行证?

ios - `Identifiable` 一致性返回类型泛型作为变量

iphone - Birdhouse 应用程序的自定义 URL

ios - 在 iPhone/iPad 应用程序中保存用户设置