首页 > 解决方案 > 测试旧操作系统版本的代码路径

问题描述

如果我有一些带有以下方法的库:

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

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

我认为唯一可行的方法是多次运行测试套件 - 每个支持的操作系统版本一次,然后创建一个脚本来组合代码覆盖率统计信息。谁能想到更好的方法?

标签: swiftunit-testingcode-coverage

解决方案


您可以在测试中创建一个标志,是否跳过操作系统版本检查以及&&检查#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"

推荐阅读