如何为 UserDefaults 编写单元测试
Posted
技术标签:
【中文标题】如何为 UserDefaults 编写单元测试【英文标题】:How to write Unit Test for UserDefaults 【发布时间】:2020-01-22 02:08:59 【问题描述】:我有 2 个函数,其中一个基本上检索用户默认值中的字符串,另一个将字符串写入用户默认值中。我无法理解是否应该进行单元测试?而且我对单元测试的概念还很陌生。
我在互联网上搜索测试用户默认值,但最后我被建议模拟测试。
我的问题是如果有办法测试用户默认值,那么最好的方法是什么?
常量和结构
let defaults = UserDefaults.standard
let defaultinformation = "ABCDEFG"
struct Keys
static let Information = "Information"
保存信息的功能
func SetDefaultInformation()
defaults.set(defaultinformation, forKey: Keys.Information)
检索信息的函数
func checkForInformation() -> String
let Information = defaults.value(forKey: Keys.Information) as? String ?? ""
return Information
提前致谢
【问题讨论】:
有关如何编写 Test Double 以便您可以对 UserDefaults 调用进行单元测试的示例,请参阅 pragprog.com/book/jrlegios/ios-unit-testing-by-example 的第 11 章 【参考方案1】:我应该做单元测试还是不做
没有。你知道什么 UserDefaults 做了什么并且你知道如何它工作和那个它工作。测试苹果的代码是荒谬的。测试defaults.set
一样愚蠢;您确切地知道它的作用,并且您知道它会做到。
您要测试的是您的代码:不是您从 UserDefaults 本身检索,而是您对该检索的响应。给自己一些方法,这样你就可以看到当information
是字符串时你 做了什么,以及当information
是nil
时你 做了什么。正如您所知道的,一个简单的模拟可以提供后端,扮演 UserDefaults 的角色并返回不同类型的结果。只是不要让您的测试涉及 real UserDefaults。
【讨论】:
嘿@matt 我需要对这些函数进行单元测试,基本上添加随机字符串并保存并检查是否保存。我知道这不是必需的,测试苹果给定的功能是没有意义的,除了模拟测试之外,还有其他方法可以测试。我对测试真的很陌生。如果您能对此有所了解,那就太好了。谢谢。 当然,你明白什么是模拟吗?例如,您可以创建您的类和 UserDefaults 都符合的协议,这需要set(_:forKey:)
和 value(forKey:)
。现在,您的测试很容易插入您的类而不是 UserDefaults。正如我在回答中所说,“一个简单的模拟可以提供后端”。
不,我不懂模拟。我无法绕过它。感谢到目前为止的帮助。谢谢
这是一个很好的开始:developer.apple.com/videos/play/wwdc2018/417以上是关于如何为 UserDefaults 编写单元测试的主要内容,如果未能解决你的问题,请参考以下文章