Подтвердить что ты не робот

Проект Xcode, как определить цель программно или как использовать env vars

Я хочу выполнить тест приложения, который анализирует некоторые json, сохраняет данные ядра и считывает некоторые объекты.

Как мой код знает, будет ли он выполняться как часть теста или обычного запуска? Как-то узнать: "Мы в тестовой цели"? Поскольку приложение, когда оно запускается, теперь запускает кучу запросов, чтобы заполнить мою копию с информацией с сервера. Я не хочу, чтобы это делалось во время моих тестов. Я хочу запустить приложение, прочитать HARDCODED json из файла и сохранить его, используя те же методы, что и в случае с coredata, и проверить результаты.

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

4b9b3361

Ответ 1

Не обращайте внимания... выяснил, что именно в "Схемах" вы установили это.

Например, если вы хотите, чтобы TARGET = TEST был доступен во время теста и TARGET = RUN для отображения во время запуска, просто установите это в вашей схеме > Переменные окружения > Имя/Значение.

Затем из вашего приложения вы можете:

[[[NSProcessInfo processInfo] environment] objectForKey:@"TARGET"]

Использование настроек сборки с макросами препроцессора НЕ работает для меня b/c Моя тестовая цель (для тестирования приложений/интеграции) зависит от моей основной (не тестовой) цели, поэтому главная цель сначала построена, а то, что работает, и в итоге вы получаете основные макросы препроцессора, даже если вы находитесь за теми, которые определены в целевой вами цели. Если я что-то пропустил, кто-то может объяснить, пожалуйста.

Ответ 2

Если по "тестовой цели" вы имеете в виду ваши юнит-тесты (т.е. Product > Test или ⌘U), вы можете добавить макрос препроцессора к цели и проверить этот макрос в своем коде. Это позволяет сделать что-то вроде следующего:

#ifdef TEST
  // Load the hard-coded data.
#else
  // Load data from the server.
#endif

Чтобы сделать это, щелкните файл проекта в навигаторе проекта, выберите тестовый объект, перейдите на вкладку Build Settings, найдите "макросы", дважды щелкните по опции Preprocessor Macros и добавьте один!

Ответ 3

Вы можете использовать приведенную ниже функцию.

+(BOOL)  isRunningTests
{
    NSDictionary* environment = [[NSProcessInfo processInfo] environment];
    NSString* injectBundle = environment[@"XCInjectBundle"];
    return [[injectBundle pathExtension] isEqualToString:@"xctest"];
}

Ответ 4

Здесь есть две ситуации:

  • Запустите некоторый код, если выбрана определенная цель, такая как Tests, и
  • Условно #import некоторые файлы для определенной цели, такие как Tests.

Целевой код для тестовой цели:

Создайте макрос в файле ProjectName-Prefix.pch следующим образом:

#define IsTestTarget [[[[NSProcessInfo processInfo] environment][@"XCInjectBundle"] pathExtension] isEqualToString:@"xctest"]

а затем вызовите его в любом месте приложения:

if (IsTestTarget) {
    //Do something specific for test target;
} else {
    //Otherwise do something else
}

Условный #import:

В #import определенные файлы, когда выбрана цель Tests, вам нужно добавить Preprocessor Macro в ваш целевой объект Test и использовать его как:

#ifdef APPTESTS
    #import "TestSpecificFile.h"
#else
    #import "SomeOtherFile.h"
#endif 

Вот как вы можете добавить Preprocessor Macro:

enter image description here