我有一些 Swift 2.0 代码,我正在努力实现 100% 的代码覆盖率。我正在做一些 JSON 处理,其中一部分看起来像这样:
guard let jsonData = jsonText.dataUsingEncoding(NSUTF8StringEncoding) else {
throw ErrorCode.JSONEncodingFailure
}
我认为现实世界中没有任何字符串无法编码为 UTF-8 的情况,但我也不想让自己面临崩溃错误,因此必须保留该代码。我如何模拟 jsonText
对象为 dataUsingEncoding()
返回 nil?
我最接近的是像这样对 NSString 进行子类化:
public class BadString: NSString {
public override var length: Int {
get {
return 5
}
}
public override func characterAtIndex(index: Int) -> unichar {
return 0
}
public override func dataUsingEncoding(encoding: NSStringEncoding) -> NSData? {
return nil
}
}
不过问题来了。为了使用我的模拟实现,我必须将 jsonText
(函数参数)定义为 NSString
,而不是 String
,这对于全 Swift 代码库感觉不对。将其定义为 Swift String
后,我必须将我的 BadString
转换为该类型,并且它使用 String
实现而不是我自己的实现。
是否有另一种(干净的)方法来实现这一目标?
最佳答案
您将很难找到无法使用 UTF-8 编码的字符串!只要您知道这是您将要使用的编码,我建议您不要担心测试“编码失败”的情况。
但是,如果您仍然希望测试它,那么我建议您进行以下更改之一以允许您这样做:
(1) 改变你对“失败”的思考方式:如果你知道你正在编码的字符串总是非空的,那么扩大guard
还要求编码数据的长度 > 0,例如=>
guard let jsonData = jsonText.dataUsingEncoding(NSUTF8StringEncoding)
where jsonData.length > 0 else {
throw ErrorCode.JSONEncodingFailure
}
...使用这个想法,您现在可以为 jsonText
使用空字符串并触发此代码路径(假设空字符串也满足您在此处对“失败”的定义)
(2) 将您的字符串编码值存储在一个变量中(我们称之为 stringEncoding
),您可以在测试设置期间访问该变量,然后使用 jsonText
的不兼容值对其进行测试和 stringEncoding
,例如=>
var jsonText = "🙈"
let stringEncoding = NSASCIIStringEncoding
...我保证jsonText.dataUsingEncoding(stringEncoding)
将返回 nil
在这种情况下:)
测试愉快!希望对您有所帮助!
关于swift - 在 Swift 中模拟 String 类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32362766/