微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

运行单元测试时删除 UserDefaults 生成的 plist 文件

如何解决运行单元测试时删除 UserDefaults 生成的 plist 文件

我正在测试一个依赖于 UserDefaults 实例的类。按照此示例代码找到 here,我像这样创建和设置实例:

override func setUp() {
    super.setUp()
    defaults = UserDefaults(suiteName: #file)
    defaults.removePersistentDomain(forName: #file)
}

运行测试后,会在与此测试类相同的目录中创建一个 plist 文件。如果我的测试文件名为 TestFile.swift,则 plist 的名称TestFile.swift.plist。我很确定这是在调用上面的 suiteName: 初始化程序时生成的。我的问题是:测试完成后如何删除文件?我尝试在测试的 removeSuite(named: #file) 方法调用 removeVolatileDomain(forName: #file)removePersistentDomain(forName: #file)tearDown,但没有成功。调用 synchronize() 似乎也无济于事。

解决方法

理想情况下,不是传递 UserDefaults 的实际实例,而是传递不需要清理的不同类型的对象。一个简单的例子是这样的:

class UnitTestDefaults: UserDefaults {

    private var values = [String: Any]()

    // override only the functions you need,e.g.

    override func object(forKey defaultName: String) -> Any? {
        values[defaultName]
    }

    override func setValue(_ value: Any?,forKey key: String) {
        values[key] = value
    }

}

或者,您可以定义一个新协议,并使您正在测试的对象依赖于该协议的一个实例,而不是 UserDefaults。这将被认为是单元测试更合适的做法,如果简单地创建 UserDefaults 的实例,即使是未定义自定义套件的子类,仍然会产生不需要的副作用,也可以解决您的问题。

protocol DefaultsStorage {
    func object(forKey defaultName: String) -> Any?
    func setValue(_ value: Any?,forKey key: String)
}

class UnitTestDefaults: DefaultsStorage {
    // ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。