首页 > 解决方案 > 如何模拟和测试存储字符串的 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)
    }
  }
}

标签: swifttestingswiftyuserdefaults

解决方案


您可以子类化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

您应该在使用它们之前添加 PREPROCESSOR 标志

#if TESTING
    let userDefaults: UserDefaults = UserDefaults.standard
    #else
    let userDefaults: UserDefaults = MockUserDefaults(suiteName: "testing") ?? UserDefaults.standard
#endif

推荐阅读