swift - 如何模拟和测试存储字符串的 UserDefaults 计算属性?
问题描述
我正在尝试模拟 UserDefaults 以测试其行为。
在不破坏保存用户令牌密钥的真实计算属性的情况下,最好的方法是什么?
class UserDefaultsService {
private struct Keys {
static let token = "partageTokenKey"
}
//MARK: - Save or retrieve the user token
static var token: String? {
get {
return UserDefaults.standard.string(
forKey: Keys.token)
}
set {
UserDefaults.standard.set(
newValue, forKey: Keys.token)
}
}
}
解决方案
您可以子类化UserDefaults
:
(来源)
class MockUserDefaults : UserDefaults {
convenience init() {
self.init(suiteName: "Mock User Defaults")!
}
override init?(suiteName suitename: String?) {
UserDefaults().removePersistentDomain(forName: suitename!)
super.init(suiteName: suitename)
}
}
而UserDefaultsService
不是直接访问UserDefaults.standard
,您可以根据您正在运行的目标创建属性。在生产/登台中,您可以拥有UserDefaults.standard
,而在测试中,您可以拥有MockUserDefaults
#if TESTING
let userDefaults: UserDefaults = UserDefaults.standard
#else
let userDefaults: UserDefaults = MockUserDefaults(suiteName: "testing") ?? UserDefaults.standard
#endif
推荐阅读
- javascript - 如何在对象数组中查找项目
- visual-c++ - 如何从 BSTR* 中获取价值
- javascript - 当我点击一个表单域时如何显示一个表单域(输入类型=“文本”)
- python - sorted() 中的 Python lambda 函数
- ruby-on-rails - Minitest::Mock#expect 没有特定的顺序?
- php - 无法访问此站点 localhost 拒绝连接
- r - 在日期上使用子集,从所需的时间范围内给出偏移的日期
- facebook - 如何自动化 Facebook 游戏使用 sikuliapix 和 Selenium WebDriver?
- c# - 在 C# 中为可空结构的成员赋值
- c++ - 从文件中读取选定范围的行并存储到数组中