测试旧 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

到目前为止我的所有想法都没有帮助:

我认为唯一可行的方法是多次 运行 测试套件 - 每个支持的 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"