测试旧 OS 版本的代码路径
Testing codepaths for older OS versions
如果我有一些库,方法如下:
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
出于与前一点类似的原因。
我认为唯一可行的方法是多次 运行 测试套件 - 每个支持的 OS 版本一次,然后创建一个脚本来组合代码覆盖率统计信息。谁能想到更好的方法?
您可以在测试中创建一个标志,是否跳过 OS 版本检查,&&
通过 #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"
如果我有一些库,方法如下:
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
出于与前一点类似的原因。
我认为唯一可行的方法是多次 运行 测试套件 - 每个支持的 OS 版本一次,然后创建一个脚本来组合代码覆盖率统计信息。谁能想到更好的方法?
您可以在测试中创建一个标志,是否跳过 OS 版本检查,&&
通过 #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"