我有一些Swift 2.0代码,我正在努力实现100%的代码覆盖率。我正在做一些JSON处理,其中一部分看起来是这样的:
guard let jsonData = jsonText.dataUsingEncoding(NSUTF8StringEncoding) else {
throw ErrorCode.JSONEncodingFailure
}
我不认为现实世界中有任何字符串不能编码为UTF-8的情况,但我也不想让自己面对崩溃错误,所以代码必须保留。如何模拟
jsonText
对象以返回nil fordataUsingEncoding()
?我最近得到的是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的代码基来说是错误的。当它被定义为SwiftString
时,我必须将我的BadString
转换为该类型,并且它使用String
实现而不是我自己的实现。有没有别的(干净的)方法来达到这个目的?
最佳答案
您将很难找到无法使用UTF-8编码的字符串!只要你知道这是你将要使用的编码,我建议你不要担心测试“编码失败”的情况。
但是,如果您仍然想测试它,那么我建议您进行以下更改之一,以便允许您这样做:
(1)改变你对“失败”的思考方式:如果你知道你正在编码的字符串总是非空的,那么把guard
加宽到还要求编码数据的长度大于0,例如=>
guard let jsonData = jsonText.dataUsingEncoding(NSUTF8StringEncoding)
where jsonData.length > 0 else {
throw ErrorCode.JSONEncodingFailure
}
…使用此思想,现在可以为
jsonText
使用空字符串并触发此代码路径(假设空字符串也满足此处对“failure”的定义)(2)将字符串编码值存储在一个变量(我们称之为
stringEncoding
)中,您可以在测试设置期间访问该变量,然后使用jsonText
和stringEncoding
的不兼容值对其进行测试,例如=>var jsonText = "🙈"
let stringEncoding = NSASCIIStringEncoding
…我保证在这种情况下
jsonText.dataUsingEncoding(stringEncoding)
将返回nil
:)快乐的测试!我希望这有帮助!
关于swift - 在Swift中模拟String类方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32362766/