首页 > 解决方案 > 在 Swift 中测试 write(to: url)

问题描述

我有一个使用的功能

func write(to url: URL, atomically useAuxiliaryFile: Bool, encoding enc: String.Encoding) throws

这样:

func writeString(string: String, withDestinationFileName dest: String, withSubDirectory: String = ""){
        _ = createDirectory(toDirectory: directory, withSubDirectoryPath: withSubDirectory)
        if let fullDestPath = buildFullURL(forFileName: dest, withSubDirectoryPath: bundleName, inDirectory: directory)
        do {
            try string.write(to: fullDestPath!, atomically: true, encoding: .utf8)
        } catch let error {
            print ("error\(error)")
        }

} }

通常为了测试我使用模拟和存根的文件功能,例如我刚刚为 Filemanager.default 编写了一个模拟。

然而,这里我们有一个关于 NNString ( Documentation ) 的实例方法,那么我们会怎么做呢?

选项:

  1. 为 NSString 注入一个模拟
  2. 不测试这个功能
  3. 重写函数,使其返回一个 Bool,并检查结果
  4. 通过函数签名注入 .write 函数并替换 或其他选项?

标签: swift

解决方案


我认为,最好的方法是使用协议:

protocol WriteableString {
    func write(to url: URL, atomically: Bool, encoding: String.Encoding) throws
}

extension String: WriteableString {}

class MockWriteableString {
    var url: URL?

    func write(to url: URL, atomically: Bool, encoding: String.Encoding) throws {
        self.url = url
        //...
    }
}

并将您的功能更改为: func writeString(string: WriteableString, withDestinationFileName dest: String, withSubDirectory: String = "")

使用这种方法,您可以测试您的函数并检查例如url传递给write(to:atomically:encoding)函数是否良好。


推荐阅读