swift - 在 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 ) 的实例方法,那么我们会怎么做呢?
选项:
- 为 NSString 注入一个模拟
- 不测试这个功能
- 重写函数,使其返回一个 Bool,并检查结果
- 通过函数签名注入 .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 = "")
使用这种方法,您可以测试您的函数并检查例如url
传递给write(to:atomically:encoding)
函数是否良好。
推荐阅读
- php - 根据一周中的特定日子隐藏运输方式
- firebase - 没有创建 Firebase 应用“[DEFAULT]” - 从 8.2.0 升级到 8.9.1 后调用 Firebase App.initializeApp() (app/no-app)
- visual-studio - Visual Studio 的显示信息下边距
- google-cloud-storage - 如何为 Google Cloud Store Bucket 设置块(块)大小?
- java - Java简化涉及布尔比较的重复代码
- python - 现在要从 2d Numpy 数组中删除与给定条件匹配的某些行?
- firebase - Firestore 在简单的 hello world 场景中运行缓慢
- java - 与java同时调用具有IN OUT SYS_REFCURSOR参数的oracle存储过程
- excel - 制作按难度排序的自动更新目标列表
- c# - 旧生成的玩家无法更新新生成的玩家的位置,但新生成的玩家可以跟踪旧生成的玩家的更新位置