gpt4 book ai didi

xcode - NSUserDefault 不应该是单元测试的白板吗?

转载 作者:行者123 更新时间:2023-12-03 09:00:17 24 4
gpt4 key购买 nike

我正在编写我的第一个 iOS 单元测试(Xcode 5、iOS 6),并发现单元测试的结果取决于我最近在模拟器中所做的事情。例如。我在模拟器的联系人列表中单击了一个用户,现在我在 UserDefaults 中的“最近的联系人”数据比以前多了一个对象,即使我正在运行单元测试也是如此。

对于单元测试,拥有随机用户默认数据并不干净(我习惯于使用他们自己的干净数据库进行 RoR 测试)。此外,我可能想测试特定状态,例如有空的“最近联系人”数据。

通过查看此处的相关问题,我似乎有一些我不满意的可能答案。

  • 模拟单元测试的 UserDefaults !我将不得不修改许多现有的类,以便可以注入(inject)该模拟。
  • 在 setUp 方法中清除或自定义 UserDefaults!但随后我在手动测试中费力创建的数据就会消失。
  • 在设置方法中清除或自定义 UserDefaults 然后 在 tearDown 中恢复这些值!哎哟。

  • 对于应该成为单元测试标准实践的东西来说,这些似乎不必要地复杂。我不想在每个单元测试中重复自己。所以,我的问题是:
  • 关于从临时模拟器测试到单元测试运行的 UserDefaults 持久化方式,我是否遗漏了一些可取的东西?
  • 有没有一种可配置的方法来解决这个问题,比如将单元测试目标设置为具有与使用模拟器手动测试时不同的 UserDefaults 存储位置的方法?
  • 如果做不到这一点,有没有一种优雅的方法可以在代码中做到这一点?
  • 例如,我可以让 MyAppTestCase 对象继承自 XCTestCase 并覆盖 setUp 和 tearDown 方法以始终搁置然后恢复 UserDefaults。这是一个好主意吗?
  • 最佳答案

    使用命名套件 like in this answer对我来说效果很好。删除用于测试的用户默认值也可以在 func tearDown() 中完成。 .

    class MyTest : XCTestCase {
    var userDefaults: UserDefaults?
    let userDefaultsSuiteName = "TestDefaults"

    override func setUp() {
    super.setUp()
    UserDefaults().removePersistentDomain(forName: userDefaultsSuiteName)
    userDefaults = UserDefaults(suiteName: userDefaultsSuiteName)
    }
    }

    关于xcode - NSUserDefault 不应该是单元测试的白板吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19084633/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com