如何为 UserDefaults 编写单元测试

Kan*_*e D 6 nsuserdefaults xctest swift userdefaults swift5

我有两个函数,其中一个函数基本上检索用户默认值中的字符串,另一个函数将字符串写入用户默认值中。我不明白我应该进行单元测试还是不进行?我对单元测试的概念还很陌生。

我在互联网上搜索测试用户默认值,但最后建议我模拟测试。

我的问题是,如果有办法测试用户默认值,最好的方法是什么?

常量和结构体

let defaults = UserDefaults.standard
let defaultinformation = "ABCDEFG"

struct Keys {
    static let Information = "Information"
}
Run Code Online (Sandbox Code Playgroud)

保存信息的功能

func SetDefaultInformation() {
    defaults.set(defaultinformation, forKey: Keys.Information)

}
Run Code Online (Sandbox Code Playgroud)

检索信息的函数

func checkForInformation() -> String {
    let Information = defaults.value(forKey: Keys.Information) as? String ?? ""
    return Information
}
Run Code Online (Sandbox Code Playgroud)

提前致谢

mat*_*att 9

我应该做单元测试还是不做

不。您知道UserDefaults 的作用,也知道它是如何工作的以及它是如何工作的。测试苹果的代码是荒谬的。测试defaults.set同样愚蠢;你确切地知道它做什么,并且知道它会做什么。

您想要测试的是您的代码:不是您从 UserDefaults 本身进行的检索,而是您对该检索的响应。给自己一些方法,以便您可以看到当 is 是 String 时做什么以及information当is时做什么。正如您所知道的,一个简单的模拟可以提供后端,扮演 UserDefaults 的角色并返回不同类型的结果。只是不要让您的测试涉及真正的UserDefaults。informationnil

  • 这是一个很好的开始:https://developer.apple.com/videos/play/wwdc2018/417 (2认同)

小智 6

class ViewModel {
     func saveUserName(name: String, userDefaults: UserDefaults = UserDefaults.standard) {
            userDefaults.set(name, forKey: "username")
     }
}
Run Code Online (Sandbox Code Playgroud)
class MockUserDefault: UserDefaults {
    var persistedUserName: String? = nil
    var persistenceKey: String? = nil
        
    override func set(_ value: Any?, forKey defaultName: String) {
        persistedUserName = value as? String
        persistenceKey = defaultName
    }
}
    
func testSavingUserName() {
    let viewModel = ViewModel()
    let mockUserDefaults = MockUserDefault()
    viewModel.saveUserName(name: "Oliver", userDefaults: mockUserDefaults)
        
    XCTAssertEqual("Oliver", mockUserDefaults.persistedUserName)
    XCTAssertEqual("username", mockUserDefaults.persistenceKey)
}
Run Code Online (Sandbox Code Playgroud)