Как запускать модульные тесты iOS с cocoapods статическая библиотека

#ios #swift #unit-testing #cocoapods #static-libraries

#iOS #swift #модульное тестирование #cocoapods #статические библиотеки

Вопрос:

У нас есть много модулей разработки, которые в настоящее время связаны как динамические фреймворки. Я пытаюсь перенести динамическую платформу в статические библиотеки для статических библиотек, я устанавливаю пакет ресурсов, как показано ниже (pod_spec)

s.resource_bundles = { 'BundleName' => [ 'BundleName/**/*.{xcassets,lproj,storyboard,xib,xcassets,imageset,png,mp3,mp4,wma}' ] }

и доступ к коду, как показано ниже

Bundle.main.url(forResource: "BundleName", withExtension: "bundle")

когда я запускаю приложение, я получаю путь к пакету ресурсов, из которого я могу получать изображения / локализованный текст

То же самое не работает, когда я запускаю модульные тесты. путь к пакету ресурсов равен нулю, и все мои тесты, связанные с локализованным текстом, завершаются неудачей

как я могу это исправить?

заранее спасибо

Ответ №1:

Проблема в том, что ваши тесты представляют собой отдельный пакет от вашего приложения, поэтому при запуске Bundle.main.url(...) он будет пытаться предоставить ресурс из вашего тестового пакета, а не из вашего пакета приложений.

Я думаю, что самый простой способ сделать это — добавить ресурсы в ваш тестовый пакет. В зависимости от того, чего вы хотите достичь. Может быть полезна дополнительная справочная информация.

Комментарии:

1. > Может быть полезна дополнительная справочная информация @JanBrinker, я хочу протестировать некоторые методы, которые возвращают текст, содержащий локализованный текст. в настоящее время его возвращаемый локальный ключ (screen_name_feature_text), потому что путь к файлу localized_text не найден, поэтому модульные тесты не выполняются

Ответ №2:

Отвечая на мой собственный вопрос после целого дня борьбы

Когда модульный тест запускает ваш код, ваш модульный тестовый пакет НЕ является основным пакетом.

Даже если вы запускаете тесты, а не ваше приложение, ваш пакет приложений по-прежнему является основным пакетом. итак, когда вы запускаете модульные тесты в режиме статических библиотек, вы не найдете resource_bundles при поиске в основном пакете.

вы должны проверить список пакетов и найти тот, у которого есть расширение «.xctest», и добавить имя модуля

 enter code here
class func bundle(for name: String) -> Bundle {
  var url = Bundle.main.bundleURL

  for bundle in Bundle.allBundles where bundle.bundlePath.hasSuffix(".xctest") {
    url = bundle.bundleURL.deletingLastPathComponent()
  }

  url = url.appendingPathComponent( name   "/"   name   ".bundle")

  guard let bundle = Bundle(url: url) else {
    return Bundle.main
  }

  return bundle
}