#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
}