使用 Kiwi、Core Data 和 Magical Record 进行单元测试
Posted
技术标签:
【中文标题】使用 Kiwi、Core Data 和 Magical Record 进行单元测试【英文标题】:Unit Testing with Kiwi, Core Data and Magical Record 【发布时间】:2013-04-12 10:31:58 【问题描述】:我在使用“假”商店进行单元测试时遇到问题。 我通过将其框架文件夹添加到我的项目并用 Kiwi 测试替换 Xcode 的默认测试用例来安装 Kiwi。这些都运行良好。
由于我使用的是 Core Data,我需要创建一个“假”存储,以便我使用真实的数据库。我使用http://www.cimgf.com/2012/05/15/unit-testing-with-core-data/ 作为我的基本指南来执行此操作。
但是,由于 Xcode 的默认测试实现在启动应用程序后运行测试,所以在任何测试运行之前,我的 '[MagicalRecord setupCoreDataStackWithStoreNamed:@"Store.sqlite"]' 仍然会在 App Delegate 内触发。
当测试尝试使用“[MagicalRecord setupCoreDataStackWithInMemoryStore]”时,该 sqlite 存储已设置,因此内存存储未设置(AFAIK),因为上述设置堆栈方法首先检查查看堆栈是否已经存在,如果存在则直接返回而不执行任何操作,所以我最终还是使用了 sqlite 数据库。
据我所知,这给我留下了以下选择:
-
为测试用例放入一些环境变量或标志,并在应用程序委托中检查这些,根据该变量创建适当的存储(即,为了测试而调整我的实际代码 - 不漂亮,也不推荐任何实践的 TDD/BDDers)。
在我的所有控制器上添加托管上下文属性,以便我可以手动指定要使用的存储(消除了 MagicalRecord 单例访问模式的大量细节)。
(小心地)玩弄我的实际数据库(我什至不愿意考虑这个)。
这些似乎都不是特别好的解决方案,所以我希望有人能看到我愚蠢地忽略的更好的解决方案。
【问题讨论】:
【参考方案1】:您的测试不应启动应用委托。按照您参考的文章中的建议,尝试设置您的测试,以便只有测试设置内存中的核心数据存储。
【讨论】:
我得出了同样的结论,但这阻止了我测试 UI。目前我在测试时使用了一些标志来离开数据库,但我正在转移到Reactive Cocoa,这将消除我对 UI 测试的需求,当我完成此操作后,我将阻止它启动委托。以上是关于使用 Kiwi、Core Data 和 Magical Record 进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章
magic_quotes_runtime 和 magic_quotes_sybase 的作用