有没有机会针对EKEventStore编写单元测试?

时间:2014-08-20 16:41:56

标签: ios objective-c ekeventstore

我们正在实施"与日历同步"功能在我们的应用程序我们的同步过程涉及我们从服务器端获取的要复制到iPhone日历的事件。目前我不确定我们为此同步编写的方法是否解决了我们期望的所有可能情况,这就是我想要对其进行单元测试的原因。它包含许多对EKEventStore的调用,正如Apple文档所述,它需要首先使用requestAccessToEntityType:completion:调用:

  

在iOS 6及更高版本中,您必须在使用requestAccessToEntityType:completion:初始化事件存储后请求访问实体类型,以便返回数据。

...在我们运行单元测试的环境中很难处理。

目前我正在考虑实现EKEventStore的模拟子类,其后面是一些EKEvent对象的NSArray。

是否有可能在没有编写模拟子类的情况下针对EKEventStore进行单元测试,模拟子类会模仿我们在同步例程中使用的所有方法?

1 个答案:

答案 0 :(得分:6)

最近我发现最终可以在模拟器中使用特殊的黑客做到这一点:有TCC.db数据库,其中存储了此权限和其他一些访问权限。

我能够设置我的单元测试套件,以便在启动时使用与TCC.db对应的值修改此EKAuthorizationStatusAuthorized表。完成此更改后,可以编写所有后续测试,并且可以完全访问EKEventStore

首先,我要解释一下:Grant access to NAB programatically on iOS 7.0 Simulator

还有一个很好的项目JPSimulatorHacks,其中包含完成此hack的代码。它支持授予日历权限。

现在,我可以对我的Calendar Sync代码进行单元测试,而无需详尽地记录EK类。

重要细节:

如果您的测试目标未指向TCC.db中的实际应用,则至少我无法找到Host Application。当我将Host Application设置为None时,我无法找到TCC.db并因此授予任何内容。这就是为什么目前我的单元测试目标我创建了人工应用程序MyAppNameTestsApp所以现在我将我的单元测试目标Host Application设置为MyAppNameTestsApp。这为我提供了TCC.db的有效应用,同时在运行Cmd+U时不需要我加载整个应用。