我有一个使用
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(文档(上有一个实例方法,那么我们该怎么办?
选项:
- 为 NSString 注入模拟
- 不测试此函数
- 重写函数,使其返回布尔值,并检查结果
- 通过函数签名注入 .write 函数并替换 还是另一种选择?
我认为最好的方法是使用协议:
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 = "")
使用这种方法,您可以测试您的函数,并检查传递给write(to:atomically:encoding)
函数url
是否良好。