Тестирование путей кода для старых версий ОС - PullRequest
1 голос
/ 07 апреля 2020

Если у меня есть какая-то библиотека с такими методами, как:

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.
  • вы не можете добавить какой-нибудь хакерский логический код, который вы могли бы установить в тестах, например #available(macOS 10.15, *) || isMacOS10_15, по аналогичной причине с предыдущим пунктом.

Единственное, что я думаю, сработает, это запустить набор тестов несколько раз - один раз для каждой поддерживаемой версии ОС, а затем создать сценарий для объединения статистики покрытия кода. Кто-нибудь может придумать лучший подход?

1 Ответ

0 голосов
/ 07 апреля 2020

Вы можете создать флаг в своих тестах, пропустить проверку версии ОС или нет и &&, что с вашей проверкой #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"
...