gpt4 book ai didi

swift - 在 Swift 中模拟 String 类方法

转载 作者:行者123 更新时间:2023-11-28 06:59:36 25 4
gpt4 key购买 nike

我有一些 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com