Проект XCode, как определить цель программно или как использовать env vars - PullRequest
28 голосов
/ 06 августа 2011

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

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

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

Ответы [ 5 ]

34 голосов
/ 06 августа 2011

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

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

Тогда из вашего приложения вы можете сделать:

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

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

10 голосов
/ 06 августа 2011

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

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

. Для этого щелкните файл проекта в навигаторе проекта, выберите цель теста, перейдите на вкладку Build Settings, выполните поиск по «макросам», дважды щелкнитеPreprocessor Macros и добавьте один!

6 голосов
/ 05 июня 2014

Существует две ситуации:

  1. Запустите некоторый код, если выбрана определенная цель, такая как Tests, и
  2. Условно #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

5 голосов
/ 03 мая 2014

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

+(BOOL)  isRunningTests
{
    NSDictionary* environment = [[NSProcessInfo processInfo] environment];
    NSString* injectBundle = environment[@"XCInjectBundle"];
    return [[injectBundle pathExtension] isEqualToString:@"xctest"];
}
0 голосов
/ 22 апреля 2018

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

@interface MockClass : NSObject

@end

Target Membership Screenshot

Затем в коде приложения вы можете проверить, существует ли класс, используя функцию NSClassFromString (которая вернет Nil для цели, не включенной в целевое членство класса, в данном случае - не тестовую цель.

if (NSClassFromString(@"MockClass")) {
    //Test Target
} else {
    //App Target
}

И вы можете проклясть его функцию

BOOL isUnitTest(){
    return NSClassFromString(@"MockClass") != Nil;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...