假设我有一个非常常见的属性包装用例,使用UserDefaults
.
@propertyWrapper
struct DefaultsStorage<Value> {
private let key: String
private let storage: UserDefaults
var wrappedValue: Value? {
get {
guard let value = storage.value(forKey: key) as? Value else {
return nil
}
return value
}
nonmutating set {
storage.setValue(newValue, forKey: key)
}
}
init(key: String, storage: UserDefaults = .standard) {
self.key = key
self.storage = storage
}
}
我现在声明一个对象,它将保存我存储在UserDefaults
.
struct UserDefaultsStorage {
@DefaultsStorage(key: "userName")
var userName: String?
}
现在,当我想在某个地方使用它时,比如说在视图模型中,我会有这样的东西。
final class ViewModel {
func getUserName() -> String? {
UserDefaultsStorage().userName
}
}
这里很少出现问题。
- 在这种情况下,我似乎有义务使用
.standard
用户默认值。如何使用其他/模拟实例测试该视图模型UserDefaults
? - 如何使用其他/模拟实例测试该属性包装器
UserDefaults
?我是否必须创建一个新类型,它是上述的干净副本DefaultsStorage
,通过模拟UserDefaults
并测试该对象?
struct TestUserDefaultsStorage {
@DefaultsStorage(key: "userName", storage: UserDefaults(suiteName: #file)!)
var userName: String?
}