使用 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 进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上使用委托进行 Kiwi 异步测试

kiwi的使用安装

magic_quotes_runtime 和 magic_quotes_sybase 的作用

使用 Kiwi 获取测试结果

FlinkFlink 报错 Corrupt data, magic number mismatch. Expected

kiwi syslog设置问题求高手