2013-04-12 38 views
3

我在使用'假'商店进行单元测试时遇到了问题。 我已经安装了Kiwi,将其框架文件夹添加到我的项目中,并用Kiwi测试替换了Xcode的默认测试用例。这些都运行良好。用猕猴桃,核心数据和魔法记录进行单元测试

由于我使用的是核心数据,我需要创建一个'假'商店,所以我在玩真正的数据库。我用http://www.cimgf.com/2012/05/15/unit-testing-with-core-data/作为我的基本指南来做到这一点。但是,由于Xcode的默认测试实现在启动应用程序后运行测试,因此在任何测试运行之前,我的'[MagicalRecord setupCoreDataStackWithStoreNamed:@“Store.sqlite”]'仍然在App Delegate内部被触发。

在测试尝试使用'[MagicalRecord setupCoreDataStackWithInMemoryStore]'时,此sqlite存储设置完成,所以内存存储没有设置(AFAIK),因为上述设置堆栈方法检查首先看看一个堆栈是否已经存在,并且如果它没有执行任何东西就返回,所以我最终还是使用了sqlite数据库。

据我所知,这给我留下了以下选项:

  1. 把一些环境变量或标志中的测试用例,并检查这些在应用程序的委托,创建相应的商店取决于这个变量(即为了测试而调整我的实际代码 - 并不漂亮,也不由任何实践的TDD/BDDers推荐)。
  2. 在我的所有控制器上添加托管上下文属性,以便我可以手动指定要使用的存储(移除MagicalRecord单例访问模式的大量优点)。
  3. 与我的实际数据库(仔细)玩(我真的不想甚至想到这一点)。

这些似乎都不是一个特别好的解决方案,所以我希望有人能看到我愚蠢地忽略的更好的解决方案。

回答

2

您的测试不应该启动应用程序委托。按照您参考的文章中的建议,尝试设置您的测试,以便只有测试设置内存核心数据存储。

+0

我得出了同样的结论,但是这阻止了我测试UI。目前,我在测试时使用了一些标志离开数据库,但我正在转向[Reactive Cocoa](https://github.com/ReactiveCocoa/ReactiveCocoa),这将消除我对UI测试的需求,并且当我这样做时,我会阻止它启动委托。 – pseudological