【问题标题】:Any chance to write unit tests against EKEventStore?有机会针对 EKEventStore 编写单元测试吗?
【发布时间】:2014-08-20 16:41:55
【问题描述】:

我们正在我们的应用程序中实现“同步到日历”功能。我们的同步过程涉及我们从服务器端获得的要复制到 iPhone 日历的事件。目前我不确定我们为这个同步编写的方法是否能解决我们期望的所有可能的场景,这就是我想要对它进行单元测试的原因。它包含对 EKEventStore 的大量调用,正如 Apple 文档所述,首先需要使用 requestAccessToEntityType:completion: 调用它们:

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

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

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

是否有可能对 EKEventStore 进行单元测试,而无需编写模拟我们在同步例程中使用的所有方法的模拟子类?

【问题讨论】:

    标签: ios objective-c ekeventstore


    【解决方案1】:

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

    我能够设置我的单元测试套件,以便在它启动时这个TCC.db 表被修改为对应于EKAuthorizationStatusAuthorized 的值。完成此更改后,可以编写所有后续测试,并具有对 EKEventStore 的完全访问权限。

    首先在这里做一点解释:Grant access to NAB programatically on iOS 7.0 Simulator。

    还有一个不错的项目JPSimulatorHacks,其中包含包含此hack 的代码。它确实支持授予日历权限。

    现在我可以对我的日历同步代码进行单元测试,而无需对 EK 类进行详尽的存根。

    重要细节:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多