加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xcode – NSUserDefault不应该是单元测试的干净的slate?

发布时间:2020-12-15 01:56:23 所属栏目:百科 来源:网络整理
导读:我正在写我的第一个iOS单元测试(Xcode 5,iOS 6),发现单元测试的结果取决于我最近在模拟器中做了什么。例如。我点击模拟器中联系人列表中的用户,现在我的UserDefaults中的“最近的联系人”数据还有一个以上的对象,即使我正在运行单元测试。 对于单元测试
我正在写我的第一个iOS单元测试(Xcode 5,iOS 6),发现单元测试的结果取决于我最近在模拟器中做了什么。例如。我点击模拟器中联系人列表中的用户,现在我的UserDefaults中的“最近的联系人”数据还有一个以上的对象,即使我正在运行单元测试。

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

从这里看相关问题,我似乎有一些可能的答案,我不高兴。

> Mock UserDefaults进行单元测试!我必须修改许多现有的类,以便我可以注入这个模拟。
>在setUp方法中清除或自定义UserDefaults!但是,随之而来的我在手动测试中花费的数据将会消失。
>在setUp方法中清除或自定义UserDefaults,然后在tearDown中恢复这些值!哎哟。

对于在单元测试中应该是标准做法的东西,这些似乎不必要地复杂化。我不想在每个单元测试中重复一遍。所以我的问题是:

>我是否忘记了用户默认从ad-hoc模拟器测试到单元测试运行的方式?
>有没有可配置的方法来解决这个问题,有一些方法可以设置单元测试目标,以便在使用模拟器手动测试时,为UserDefaults设置不同的存储位置?
>没有,在代码中有没有一个优雅的方式来做到这一点?
>例如,我可以有一个从XCTestCase继承的MyAppTestCase对象,并覆盖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)
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读