2009-07-07 11 views
26

Śledziłem dokumentację Apple dotyczącą pisania testów jednostkowych dla iPhone'a, a po wyjęciu z pudełka, procedura wydaje się nie działać. Nie jestem pewien, czy rozumiem, gdzie test jednostkowy ma uzyskać odwołanie do delegata aplikacji.iPhone - Pobieranie zasobów dla testów jednostek logicznych

Moi Zależności są jak następuje: My_Program_target -> UnitTesting_target -> UnitTests_bundle

Poniższy fragment kodu, gdzie jest assert kończy się niepowodzeniem. Jestem bardzo zaznajomiony z CPPUNIT, ale mam problem ze zrozumieniem, jak to się krzyżuje.

- (void) testAppDelegate { 

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

} 

Dodatkowo:

Zdecydowałem w moim podejściu do zrobienia test logiczny. Próbuję odczytać w pliku XML, ale nie mam szczęścia, rozwiązując pakiet, który zapewni mi ścieżkę dostępu do mojego pliku. Próbowałem wkleić wyjściową ścieżkę przez allBundles, ale ta ścieżka też nie działa. Poniżej jest to, co mam w moim wykonaniu testu (widać oświadczenie debugowania używam do wyjścia ścieżki wiązek):

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"); 

Zasadniczo assert na ścieżce nie powiedzie się, ale jestem nie jestem pewien, co umieścić w ścieżce lub katalogu, aby odnieść się do mojego pakietu unitTest, który powiedziałem, aby skopiować zasoby pakietu. Wywołanie [NSBundle mainBundle] również nie działa.

+0

Zbudowanie rozwiązania Gary'ego, wymyśliłem następujące makra preprocesorów: Xcode: TEST i DEBUG (http://stackoverflow.com/questions/6748087/xcode-test-vs-debug-preprocessor-macros/6763597 # 6763597). – ma11hew28

Odpowiedz

70

Ok, więc wymyśliłem to. Aby otworzyć plik w badanej jednostki, musisz podać nazwę pliku do otwarcia jak:

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

Jeśli uwzględni to w klasie, która jest skompilowany jako część jednostki testowej wiązce, że klasa będzie zajrzyj do zestawu testów jednostkowych dla pliku SimpleTestList.plist.

Aby przeprowadzić test jednostkowy, po prostu upewnij się, że ustawiłeś "Kopiuj zasoby pakietu", aby dołączyć Twój plist do pakietu testów jednostkowych.

+0

To był dokładnie mój problem. Dzięki za zamieszczenie tego! – kubi

+0

Nie ma problemu! Cieszę się, że pomogło! =) – Gary

+0

Ponadto, jeśli ktoś się zastanawia, również natknąłem się na ten link w odniesieniu do managedObjectModels. Podobna sytuacja. http://www.spacevatican.org/2009/9/10/unit-testing-core-data-iphone-apps – Gary

3

Jeśli potrzebujesz delegata aplikacji, musisz uruchomić testy jednostki na samym urządzeniu, a nie na symulatorze. W konsoli pojawi się także wynik testu jednostkowego, a nie wyniki kompilacji.

Kluczową rzeczą jest to, że istnieją dwa typy testów jednostkowych - testy logiczne uruchamiane poza plikiem wykonywalnym, a następnie zintegrowane rodzaje testów, które wymagają pełnego środowiska pracy.

Testy logiczne MUSZĄ być uruchamiane z symulatorem wybranym jako cel lub nie będą działać.

Zintegrowane testy systemu MUSZĄ być uruchamiane jako część pliku wykonywalnego, na urządzeniu - będziesz potrzebować nowego celu, aby to osiągnąć.

Przepraszam, że to wszystko jest tak skomplikowane, ten aspekt jest wciąż bardzo pracochłonny w porównaniu do wielu innych frameworków do testowania jednostkowego.

+0

Hmm, posiadanie delegata aplikacji prawdopodobnie nie będzie konieczne dla tego, co robię. W tej chwili próbuję wykonać test mojego modelu. Przed OCUnit w najnowszym wydaniu devkit, moje testy zostały wykonane w klasie pochodnej w mojej aplikacji. Utworzę tę klasę pochodną i przetestuje się ona w osobnym wątku przed uruchomieniem i wyświetleniem widoku, który widzi użytkownik. Próbuję to uwzględnić w jednostce testowej, do której należy. Mój obecny problem polega na tym, że mam problemy z pobieraniem testu OCUnit, aby zobaczyć plik plist, nawet jeśli znajduje się on w pakiecie. – Gary

+0

... faktycznie "w pakiecie", mam na myśli to, że dodałem go do tego folderu kopii w pakiecie. – Gary

0

Swift 3 tłumaczenie odpowiedzi Gary'ego powyżej (przy użyciu adresu URL zamiast ścieżki smyczkowy) wynosi:

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

Wskazówka krytyczna i nieoczywisty część type(of: self) zamiast [self class].

Powiązane problemy