我正在编写我的第一个 iOS 单元测试(Xcode 5、iOS 6),并发现单元测试的结果取决于我最近在模拟器中所做的事情。例如,我在模拟器中单击我的联系人列表中的一个用户,现在我在 UserDefaults 中的“最近联系人”数据比以前多了一个对象,即使我正在运行单元测试也是如此。
对于单元测试,拥有随机用户默认数据并不干净(我习惯于使用他们自己的干净数据库进行 RoR 测试)。此外,我可能想测试特定状态,例如有空的“最近联系人”数据。
通过查看此处的相关问题,我似乎有一些我不满意的可能答案。
- 模拟单元测试的 UserDefaults !我将不得不修改许多现有的类,以便可以注入该模拟。
- 在 setUp 方法中清除或自定义 UserDefaults!但随后我在手动测试中费力创建的数据就会消失。
- 在 setUp 方法中清除或自定义 UserDefaults,然后在 tearDown 中恢复这些值!哎哟。
对于应该成为单元测试标准实践的东西来说,这些似乎不必要地复杂。我不想在每个单元测试中重复自己。所以,我的问题是:
- 关于从临时模拟器测试到单元测试运行的 UserDefaults 持久化方式,我是否遗漏了一些可取的东西?
- 有没有一种可配置的方法来解决这个问题,比如将单元测试目标设置为具有与使用模拟器手动测试时不同的 UserDefaults 存储位置的方法?
- 如果做不到这一点,有没有一种优雅的方法可以在代码中做到这一点?
- 例如,我可以让 MyAppTestCase 对象继承自 XCTestCase 并覆盖 setUp 和 tearDown 方法以始终搁置然后恢复 UserDefaults。这是一个好主意吗?