在测试中使用 UserDefaults.standard 的后果是什么?

What are the consequences of using UserDefaults.standard in tests?

假设在我们的测试方案中 execute in parallel on simulator 未选中。

下面的测试会不会很古怪?

class ExampleTests: XCTestCase {
        override func setUp() {
            super.setUp()
            UserDefaults.clear()
        }

        func testSomethingWithUserDefaults() {
            UserDefaults.standard.setValue("Hola", forKey: "exampleKey")
            ExampleClass.doSomethingThatUsesUserDefaults()
            XCTAssertEqual(ExampleClass.foo, expectedValue)
        }

        override class func tearDown() {
            UserDefaults.clear()
            super.tearDown()
        }

我知道最好将 UserDefaults 存根或创建一个新实例,这样我们的测试就可以 运行 并行进行,但我想在这里确定重要性级别。这只会阻止我们将来 运行 并行测试,还是会在不应用此设置的情况下导致不稳定的测试?

测试,运行 隔离,将工作。但这里还有另一个问题:它会主动清除用户默认设置。这会给想要在 运行 完成此测试后进行手动测试的任何人带来问题。

更安全的方法是让 setUp() 记住当前值(如果有),然后在 tearDown() 中恢复它。

最安全的方法是使用假货。