iPhone - получение ресурсов для логических юнит-тестов

Я следил за документацией Apple по написанию юнит-тестов для iPhone, и из коробки рутина, похоже, не работает. Я не уверен, что понимаю, где собирается модульный тест, чтобы получить ссылку на делегат приложения.

Мои зависимости выглядят следующим образом: My_Program_target -> UnitTesting_target -> UnitTests_bundle

Следующий фрагмент кода, где утверждение не удается. Я очень знаком с CPPUNIT, но мне трудно понять, как это пересекается.

- (void) testAppDelegate {

    id yourApplicationDelegate = [[UIApplication sharedApplication] delegate];
    STAssertNotNil(yourApplicationDelegate, @"UIAppliation failed to find the AppDelegate");

}

Дополнительно:

В своем подходе я решил провести логический тест. Я пытаюсь прочитать в XML-файле, но мне не везет, разрешая пакет, который предоставит мне путь, по которому я могу получить доступ к своему файлу. Я попытался вставить путь вывода allBundles, но этот путь тоже не работает. Ниже то, что я выполняю в своем тесте (вы можете увидеть оператор отладки, который я использую для вывода путей пакетов):

NSLog(@"BundlePaths: %@", [NSBundle allBundles]);
   NSString * path = [[NSBundle bundleWithPath:@"$(TARGET_BUILD_DIR)"] pathForResource:@"SimpleTestList" ofType:@"plist"];
   STAssertNotNil(path, @"Bundle Location couldn't find the file specified");

По сути, утверждение на пути не является успешным, но я не уверен, что указать путь или каталог для ссылки на мой пакет unitTest, который я сказал, чтобы скопировать ресурсы пакета. Вызов [NSBundle mainBundle] также не работает.

3 ответа

Решение

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

NSString * filePath = [[NSBundle bundleForClass:[self class] ] pathForResource:@"SimpleTestList" ofType:@"plist"];

Если вы включите это в класс, скомпилированный как часть вашего пакета модульных тестов, этот класс будет искать внутри пакета модульных тестов файл SimpleTestList.plist.

Для модульного теста просто убедитесь, что вы настроили "Копировать ресурсы комплекта", чтобы включить свой список в свой комплект модульного теста.

Если вам нужен делегат приложения, вы должны запустить модульные тесты на самом устройстве, а не на симуляторе. Кроме того, вы увидите вывод результатов модульного теста в консоли, а не в результатах сборки.

Главное, что нужно знать, это то, что есть два типа модульных тестов - логические тесты, которые выполняются вне исполняемого файла, а затем интегрированные системные тесты, для которых требуется полностью запущенная среда.

Логические тесты ДОЛЖНЫ выполняться с имитатором, выбранным в качестве цели, иначе они не будут выполняться.

Интегрированные системные тесты ДОЛЖНЫ выполняться как часть исполняемого файла на устройстве - для этого вам потребуется новая цель.

Извините, это все настолько сложно, этот аспект все еще находится в стадии разработки по сравнению со многими другими платформами модульного тестирования.

Перевод Swary 3 ответа Гэри выше (используя URL вместо строкового пути):

let url = Bundle(for: type(of: self)).url(forResource: "SimpleTestList", withExtension: "plist")

Обратите внимание на критическую и неочевидную часть type(of: self) вместо [self class],

Другие вопросы по тегам