我有一些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)中,您可以在测试设置期间访问该变量,然后使用jsonTextstringEncoding的不兼容值对其进行测试,例如=>
var jsonText = "🙈"
let stringEncoding = NSASCIIStringEncoding

…我保证在这种情况下jsonText.dataUsingEncoding(stringEncoding)将返回nil:)
快乐的测试!我希望这有帮助!

关于swift - 在Swift中模拟String类方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32362766/

10-10 21:00