2011-08-06 8 views
25

Chcę wykonać test aplikacji, który analizuje niektóre json, przechowuje do danych podstawowych i odczytuje niektóre obiekty.Projekt Xcode, jak programowo wykryć cel lub jak używać env vars

W jaki sposób mój kod może się dowiedzieć, czy jest uruchamiany w ramach testu, czy w normalnym cyklu? Po prostu sposób, aby wiedzieć "czy jesteśmy w celu testowym"? Ponieważ aplikacja po uruchomieniu uruchamia teraz kilka wniosków o wypełnienie mojej coredaty informacjami z serwera. Nie chcę tego robić podczas moich testów. Chcę uruchomić aplikację, odczytać plik HARDCODED json z pliku i zapisać go przy użyciu tych samych metod, co w przeciwnym razie do coredata i zweryfikować wyniki.

Jeśli ktoś mógłby wyjaśnić, jak przekazywać określone pary klucz-wartość na podstawie celu, które można odczytać z poziomu aplikacji, byłbym jeszcze bardziej zadowolony.

Odpowiedz

32

Nieważne ... zorientowali się, że to w "Schematach" to ustawiłeś.

Na przykład, jeśli chcesz, aby TARGET = TEST był dostępny podczas testu, a TARGET = RUN do wyświetlania podczas uruchamiania, ustaw go na Scheme> Zmienne środowiskowe> Nazwa/Wartość.

Następnie z aplikacji można zrobić:

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

Korzystanie zbudować ustawienia makr preprocesora nie działa dla mnie b/c mój cel testu (do stosowania testów/integracja) jest zależna od mój główny (nie test), więc główny cel jest budowany jako pierwszy i to właśnie działa, a kończysz z głównymi docelowymi makrami preprocesora, nawet jeśli jesteś po tych zdefiniowanych w docelowym, który uruchomiłeś. Jeśli coś przeoczyłem, proszę o wyjaśnienie.

+4

Świetna odpowiedź! Drobne dodanie: Jeśli sprawisz, że 'isTargetTest = YES', możesz odczytywać BOOL ze środowiska [[[[NSProcessInfo processInfo]] objectForKey: @" isTargetTest "]'. BOOL może być użyty bezpośrednio w instrukcji 'if', bez potrzeby porównywania ciągu znaków – Olaf

+2

ten zwraca mi wartość zerową – 2cupsOfTech

10

Jeśli przez "cel testowy" rozumiecie Państwo swoje testy jednostkowe (tj. Product > Test lub ⌘U), można dodać makro preprocesora do celu i sprawdzić, czy w kodzie znajduje się to makro. Pozwala to coś jak następuje:

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

Aby to zrobić, kliknij na pliku projektu w nawigatorze projektu, wybierz swój cel testu, kliknij kartę Build Settings, wyszukiwania dla „makra”, kliknij dwukrotnie opcję Preprocessor Macros, i dodaj!

5

Możesz użyć poniższej funkcji.

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

dwie sytuacje do czynienia z:

  1. Run jakiś kod jeśli pewnego celu wybrano takie jak Tests i
  2. warunkowo #import niektóre pliki na pewien cel, takie jak Tests.

Kod docelowa dla Testu docelowa:

Utwórz makro w pliku ProjectName-Prefix.pch następująco:

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

a następnie wywołać go w dowolnym miejscu w aplikacji:

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

Warunkowe #import:

Do #import pewne pliki po wybraniu Tests cel, trzeba zrobić, aby dodać Preprocessor Macro do celu Test i używać go jako:

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

Oto jak można dodać Preprocessor Macro:

enter image description here

+0

Niestety, import warunkowy nie będzie dla mnie działał. Makra preprocesora dla celu testowego wpłyną TYLKO na pliki źródłowe testu. Klasy "Produkcja" będą budowane z głównymi ustawieniami celu. –

+0

Twoja aplikacja zawsze buduje się z celem aplikacji, ma to na celu pokazanie sposobu, aby dowiedzieć się programowo, że testy są uruchamiane. Jeśli nie przeprowadzasz testów, to i tak nie będziesz tego potrzebować. –

Powiązane problemy