Некоторый код, который я тестирую, должен загрузить файл ресурсов. Он содержит следующую строку:
NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"txt"];
В приложении все работает нормально, но при запуске модульного тестирования pathForResource:
возвращает ноль, что означает, что он не может найтиfoo.txt
.
Я убедился, что foo.txt
он включен в фазу сборки Copy Bundle Resources цели модульного теста, так почему же он не может найти файл?
self
что это класс в основном комплекте, а не класс тестового примера. Замените[self class]
на любой класс в вашем основном комплекте. Я отредактирую свой пример.bundleForClass:
класс в комплекте модульного теста. Вы должны получить путь к файлу в коде вашего модульного теста, а затем передать строку пути вместе с другим вашим кодом.Реализация Swift:
Swift 2
Свифт 3, Свифт 4
Bundle предоставляет способы обнаружения основных и тестовых путей для вашей конфигурации:
В Xcode 6 | 7 | 8 | 9 путь пакета для модульного теста будет выглядеть
Developer/Xcode/DerivedData
примерно так ...... который отделен от
Developer/CoreSimulator/Devices
обычного (не модульного теста) пути к комплекту :Также обратите внимание, что исполняемый файл модульного теста по умолчанию связан с кодом приложения. Однако код модульного теста должен иметь только целевое членство только в комплекте тестов. Код приложения должен иметь только целевое членство в комплекте приложений. Во время выполнения целевой пакет модульного теста вводится в пакет приложения для выполнения .
Swift Package Manager (SPM) 4:
Примечание. По умолчанию командная строка
swift test
создаетMyProjectPackageTests.xctest
тестовый пакет. И,swift package generate-xcodeproj
создастMyProjectTests.xctest
тестовый пакет. Эти разные тестовые пакеты имеют разные пути . Кроме того, разные тестовые пакеты могут иметь некоторую внутреннюю структуру каталогов и различия в содержимом .В любом случае,
.bundlePath
и.bundleURL
вернет путь тестового пакета, который в данный момент выполняется на macOS. ОднакоBundle
в настоящее время не реализовано для Ubuntu Linux.Также командная строка
swift build
и наswift test
данный момент не предоставляют механизм копирования ресурсов.Однако, приложив некоторые усилия, можно настроить процессы для использования менеджера пакетов Swift с ресурсами в средах macOS Xcode, macOS и Ubuntu. Один пример можно найти здесь: 004.4'2 SW Dev Swift Package Manager (SPM) с ресурсами Qref
См. Также: Использование ресурсов в модульных тестах с Swift Package Manager.
Swift Package Manager (SPM) 4.2
Swift Package Manager PackageDescription 4.2 вводит поддержку локальных зависимостей .
Примечание: я ожидаю, но еще не проверял, что что-то вроде следующего должно быть возможно с SPM 4.2:
источник
С swift Swift 3 синтаксис
self.dynamicType
устарел, используйте его вместоили
источник
Убедитесь, что ресурс добавлен к цели тестирования.
источник
если в вашем проекте несколько целей, вам нужно добавить ресурсы между различными целями, доступными в целевом членстве, и вам может потребоваться переключиться между различными целями, выполнив 3 шага, показанных на рисунке ниже.
источник
Я должен был убедиться, что этот флажок General Testing был установлен
источник