如何重置XCTestCase的UserDefaults?

Guj*_*min 5 xcode nsuserdefaults ios xctest swift3

我试图做的很好,为类编写单元测试,但是我有一些类处理首选项并检查首次运行。我编写的测试函数在第一次运行时可以正常工作,但是由于首选项已经具有值,因此后续测试失败。设置对象nil的结果Optional<Any>值不等于nil当牵强UserDefaults.standard.object(forKey:)。

我也曾尝试UserDefaults.standard.removeObject(forKey:)和UserDefaults.standard.synchronize()和UserDefaults.resetStandardUserDefaults()。似乎没有任何作用,Bundle.main.bundleIdentifier价值就是nil我不能使用UserDefaults.standard.removePersistentDomain(forName:)!

我已经发现了首被保存在:/Users/<name>/Library/Developer/CoreSimulator/Devices/<UUID>/data/Library/Preferences/xctest.plist我已经使用字符串试图"xctest"在removePersistentDomain和太不起作用。

我可以将该值设置为其他值和核对,但我真的很讨厌的垃圾我的代码来测试永远只存在于XCTest的情况(我已经有一个专用于因为这样做复位功能UserDefaults中(XCTest用例UserDefaults与代码中的用例不同!),那么究竟如何在UserDefaultsXCTestCase中重置标准?

小智 0

没有具体的例子,很难解决你的问题,但这对我有用。

当我在类中需要 UserDefaults 时,我定义类初始值设定项来获取 UserDefaults 实例,如下所示:

class Foo {

    private let userDefaults: UserDefaults

    init(userDefaults: UserDefaults = .standard) {
        self.userDefaults = userDefaults
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以注入一个一次性的 UserDefaults 实例进行测试,如下所示:

class FooTests: XCTestCase {

    let userDefaultsSuiteName = "FooTests"
    var userDefaults: UserDefaults!
    var foo: Foo!

    override func setUpWithError() throws {
        userDefaults = UserDefaults(suiteName: userDefaultsSuiteName)
        foo = Foo(userDefaults: userDefaults)
    }

    override func tearDownWithError() throws {
        userDefaults.removePersistentDomain(forName: userDefaultsSuiteName)
    }
}
Run Code Online (Sandbox Code Playgroud)