swift - 在 Swift 中模拟 String 类方法

标签 swift unit-testing mocking swift2

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

相关文章:

ios - % 字符未显示在 iOS 通知中

swift - 获取公共(public) Facebook 页面的帖子提要

java - 带换行符的 Bash 输入重定向

c - 获取一个与内核中的任何内容都不相关的唯一文件描述符

swift - 在 Swift 中使用放置器本地化字符串

variables - 添加两个变量时如何添加空格?

c++ - C++ 的 CXX 测试框架

php - 如何在 PHP 中为单元测试伪造资源?

c# - 具有只读 Prop 和内部构造函数的返回类型的模拟第三方接口(interface)

python - 如何模拟数据库api?