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

标签 ios swift nsuserdefaults xctest userdefaults

我正在测试一个依赖于 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 set(_ value: Any?, forKey defaultName: String) {
        values[defaultName] = value
    }

}
或者,您可以定义一个新协议(protocol)并让您正在测试的对象依赖于该协议(protocol)的一个实例,而不是 UserDefaults。 .对于单元测试,这将被认为是更合适的做法,如果只是创建 UserDefaults 的实例,也可以解决您的问题。 ,即使是没有定义自定义套件的子类,仍然有不想要的副作用。
protocol DefaultsStorage {
    func object(forKey defaultName: String) -> Any?
    func set(_ value: Any?, forKey defaultName: String)
}

class UnitTestDefaults: DefaultsStorage {
    // ...
}

关于ios - 运行单元测试时删除 UserDefaults 生成的 plist 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67590416/

相关文章:

iphone - iOS 6 - 处理顶部和底部的黑色条纹

ios - 如何在导航 Controller 标题中设置副标题?

ios - 核心数据:更新子上下文

ios - 如何在 iOS 13.3 上使用 xib 显示 UITableViewCell?

ios - 如何在 Swift 中集成 Google reCAPTCHA

iOS:如何在 NSUserDefaults 中只保存一个复选标记(用于 UITableView)?

ios - 如何在 NSUserDefaults 中存储多个字典

ios - 带有 OpenSSL 的 Objective-C - 无法设置 RSA key

swift - 字符串到元组swift

ios - 如何使用 nsuserdefault 或 ios 中的任何其他对象保存动态添加的字段数据, objective-c