Пакет для тестового класса возвращает основной пакет в Xcode 10, а не пакет модульных тестов

У нас есть UnitTests, размещенные в приложении. Для загрузки тестовых ресурсов используем: Bundle(for: TestClass.self).path(forResource: "some-file", ofType: "json").

В Xcode 9 он вернул что-то вроде этого: /var/folders/4k/dzpnw8352jn_fl5hcc76pjs8k9qytq/T/com.apple.dt.XCTest/IDETestRunSession-707F04EA-2C21-4BA4-8730-00B0EC0F708F/UnitTests-2C97055A-9154-4521-9D12-7CF32FC38793/Session-UnitTests-2018-06-08_141829-RGxhj2.log

Но в Xcode 10 Bundle (для: TestClass.self) возвращает путь пакета приложения /Users/user/Library/Developer/CoreSimulator/Devices/118AACB9-486C-4E3B-94EA-257C3F082AE1/data/Containers/Bundle/Application/4234B280-E49C-4044-BAF4-CBFFEA8AFDB4/App.app

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

Обновлять:

Исправлено в Xcode 10.1


person Igor Palaguta    schedule 08.06.2018    source источник


Ответы (3)


Вероятно, это ошибка в Xcode 10/Swift 4.2, поскольку в примечаниях к выпуску есть еще одна ошибка, связанная с Bundle. Вы обязательно должны отправить радар, чтобы убедиться, что проблема известна.

Из примечаний к выпуску бета-версии Xcode 10

• Foundation API Bundle.init(for: AnyClass) всегда возвращает пакет приложения при использовании в классе, который наследуется от универсального класса, даже если сам этот класс не является универсальным. (40367300)

В качестве возможного обходного пути вы можете рассмотреть возможность использования идентификатора пакета целевого объекта тестирования.

Чтобы найти идентификатор пакета тестовой цели, посмотрите здесь: введите здесь описание изображения

Обновлять

Похоже, что Bundle была постоянной проблемой с Xcode 10 (на самом деле это Swift 4.2, у которого есть проблемы).

Из Xcode 10.1 beta 2 примечания к выпуску

• Инициализатор init(for:) класса Bundle теперь работает согласованно с классами Swift, в том числе, когда он не работает в последних версиях операционной системы. (44489216)

person allenh    schedule 10.06.2018
comment
Спасибо. Позвольте мне проверить, похоже на проблему, с которой я столкнулся - person Igor Palaguta; 10.06.2018
comment
Можете ли вы предоставить источник проблемы, о которой вы упомянули выше, что Bundle.init(for: AnyClass) всегда возвращает пакет приложения - person dev296; 11.10.2018
comment
@ dev296 Это было в примечаниях к выпуску бета-версии Xcode 10, которые, к сожалению, больше не доступны. Я обновил свой ответ ссылкой на аналогичную проблему, исправленную в бета-версии Xcode 10.1. - person allenh; 11.10.2018

Эта проблема исправлена ​​в Xcode 10.1, как указано в примечаниях к выпуску Решенные проблемы https://developer.apple.com/documentation/xcode_release_notes/xcode_10_1_release_notes

person dev296    schedule 31.10.2018

После некоторого рефакторинга класса проблема исчезла. На самом деле, если класс содержал URL или набор свойств URLRequest был неправильным.

например три класса объявлены в одном модуле, а пакет отличается:

class WithRequest {
    var request: URLRequest?
}

class WithURL {
    var url: URL?
}

class WithString {
    var string: String?
}

print(Bundle(for: WithRequest.self)) //Incorrect App Bundle
print(Bundle(for: WithURL.self)) //Incorrect App Bundle
print(Bundle(for: WithString.self)) //Correct bundle
person Igor Palaguta    schedule 11.06.2018
comment
Это все еще звучит как ошибка. Такое же поведение в Xcode 9? - person allenh; 12.06.2018