swift - 测试旧操作系统版本的代码路径
问题描述
如果我有一些带有以下方法的库:
public struct Foo {
@available(macOS 10.15, *)
func greatNewFeature() -> String {
return "new feature"
}
func legacyFeature() -> String {
return "legacy feature"
}
}
然后是一些使用它的代码:
func methodToTest() -> String {
let foo = Foo()
guard #available(macOS 10.15, *) else {
return foo.legacyFeature()
}
return foo.greatNewFeature()
}
有没有一种方法可以编写单元测试来完全覆盖methodToTest
?
到目前为止,我的所有想法都没有帮助:
- 您不能将可用性检查视为注入功能 - 编译器特别需要
@available
关键字才能使用该greatNewFeature
方法。 - 您不能添加一些可以在测试中设置的 hacky 布尔值,
#available(macOS 10.15, *) || isMacOS10_15
原因与前一点类似。
我认为唯一可行的方法是多次运行测试套件 - 每个支持的操作系统版本一次,然后创建一个脚本来组合代码覆盖率统计信息。谁能想到更好的方法?
解决方案
您可以在测试中创建一个标志,是否跳过操作系统版本检查以及&&
检查#available
。
这样,您只需testFooFeature
在打开和关闭标志的情况下进行调用,您就可以在macOS 10.15
.
var forceOldOSVersion = true
func testFooFeature() -> String {
let foo = Foo()
if !forceOldOSVersion, #available(macOS 10.15, *) {
return foo.greatNewFeature()
} else {
return foo.legacyFeature()
}
}
testFooFeature() // "legacy feature"
推荐阅读
- java - firebase 数据库的平均评分
- apache - 即使使用超级配置,Prestashop 在 Amazon AWS + RDS 中也不稳定
- python - Docker 让 Selenium 运行
- javascript - 利用 dom to image 将图像复制到剪贴板
- reactjs - 如何在 ReactJS 中独立删除动态添加的输入字段
- gis - 你如何让海龟只跟随我从加载到 netlogo 的 shapefile 创建的绿色补丁?
- javascript - 从字符串中获取回文长度
- c# - TempData 在 Web 场中失败
- google-sheets - 如何使嵌入的 Google 文档正确显示自定义字体
- python - 用 Python 读/写循环文本文件