在Swift中模拟字符串类方法

在Swift中模拟字符串类方法,swift,unit-testing,mocking,swift2,Swift,Unit Testing,Mocking,Swift2,我有一些Swift 2.0代码,我正在努力实现100%的代码覆盖率。我正在做一些JSON处理,其中一部分看起来是这样的: guard let jsonData = jsonText.dataUsingEncoding(NSUTF8StringEncoding) else { throw ErrorCode.JSONEncodingFailure } 我不认为在现实世界中有任何字符串不能被编码为UTF-8的情况,但我也不想让自己面临崩溃的错误,因此代码必须保留。如何模拟jsonText对

我有一些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) 改变您对“失败”的思考方式:如果您知道您正在编码的字符串将始终为非空,则扩展
保护
,也要求编码的数据长度大于0,例如=>

guard let jsonData = jsonText.dataUsingEncoding(NSUTF8StringEncoding)
        where jsonData.length > 0 else {
    throw ErrorCode.JSONEncodingFailure
}
…使用这种想法,您现在可以为
jsonText
使用一个空字符串,并触发此代码路径(假设一个空字符串也满足您在此处对“失败”的定义)

(2) 将字符串编码值存储在一个变量中(我们称之为
stringEncoding
),您可以在测试设置期间访问该变量,然后使用
jsonText
stringEncoding
的不兼容值进行测试,例如=>


var jsonText=“那么您希望该方法每次都返回nil,以便每次都抛出一个错误?如果是这样的话:为什么要这样做???@Kametrixom如前所述,我想在单元测试中使用这种情况,以验证是否返回了正确的错误代码。这不是用于生产代码,只是测试。谢谢,这是一些有效的方法。我仍然感兴趣的是关于<代码> SWIFT。String <代码>的嘲讽方法。这是一个有趣的问题——作为一个值类型,我通常不会考虑嘲弄<代码>字符串< /代码>,而是桥接到<代码> NString …今天我得好好想想:)你有什么想法吗?