在测试中使用 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()
中恢复它。
最安全的方法是使用假货。
假设在我们的测试方案中 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()
中恢复它。
最安全的方法是使用假货。