【问题标题】:Removing UserDefaults-generated plist file when running unit tests运行单元测试时删除 UserDefaults 生成的 plist 文件
【发布时间】:2021-08-07 22:32:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios swift nsuserdefaults xctest userdefaults


    【解决方案1】:

    理想情况下,不是传递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
        }
    
    }
    

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

    protocol DefaultsStorage {
        func object(forKey defaultName: String) -> Any?
        func set(_ value: Any?, forKey defaultName: String)
    }
    
    class UnitTestDefaults: DefaultsStorage {
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-06
      • 2014-04-18
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      相关资源
      最近更新 更多