Część kodu, który testuję jednostkowo, wymaga załadowania pliku zasobów. Zawiera następujący wiersz:
NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"txt"];
W aplikacji działa dobrze, ale po uruchomieniu przez jednostkę do testów jednostkowych pathForResource:
zwraca zero, co oznacza, że nie można jej zlokalizować foo.txt
.
Upewniłem się, że foo.txt
jest to uwzględnione w fazie kompilacji zasobów pakietu kopii docelowego testu jednostkowego, więc dlaczego nie może znaleźć pliku?
self
odnosi się do klasy w pakiecie głównym, a nie do klasy przypadków testowych. Zastąp[self class]
dowolną klasą w głównym pakiecie. Zmienię mój przykład.bundleForClass:
z klasą w pakiecie testu jednostkowego. Powinieneś uzyskać ścieżkę do pliku w kodzie testu jednostkowego, a następnie przekazać ciąg ścieżki do drugiego kodu.Szybkie wdrożenie:
Swift 2
Swift 3, Swift 4
Pakiet zapewnia sposoby odkrywania głównych i testowych ścieżek konfiguracji:
W Xcode 6 | 7 | 8 | 9 ścieżka pakietu testów jednostkowych będzie
Developer/Xcode/DerivedData
wyglądała jak ...... który jest niezależny od
Developer/CoreSimulator/Devices
zwykłej ścieżki pakietu (nie w ramach testu jednostkowego) :Należy również pamiętać, że plik wykonywalny testu jednostkowego jest domyślnie powiązany z kodem aplikacji. Jednak kod testu jednostkowego powinien mieć docelowe członkostwo tylko w pakiecie testowym. Kod aplikacji powinien mieć tylko docelowe członkostwo w pakiecie aplikacji. W czasie wykonywania pakiet docelowego testu jednostkowego jest wstrzykiwany do pakietu aplikacji w celu wykonania .
Swift Package Manager (SPM) 4:
Uwaga: Domyślnie wiersz poleceń
swift test
utworzyMyProjectPackageTests.xctest
pakiet testowy. Iswift package generate-xcodeproj
stworzyMyProjectTests.xctest
pakiet testowy. Te różne pakiety testowe mają różne ścieżki . Różne pakiety testowe mogą mieć także wewnętrzną strukturę katalogów i różnice w zawartości .W obu przypadkach,
.bundlePath
i.bundleURL
zwróci ścieżkę pakietu testowego obecnie uruchomionego na macOS. JednakBundle
nie jest obecnie zaimplementowany dla Ubuntu Linux.Ponadto wiersz polecenia
swift build
iswift test
obecnie nie zapewniają mechanizmu kopiowania zasobów.Jednak przy pewnym wysiłku możliwe jest skonfigurowanie procesów do używania Swift Package Manger z zasobami w środowisku macOS Xcode, wierszu poleceń macOS i środowisku wiersza poleceń Ubuntu. Jeden przykład można znaleźć tutaj: 004.4'2 SW Dev Swift Package Manager (SPM) z zasobami Qref
Zobacz także: Używaj zasobów w testach jednostkowych za pomocą Swift Package Manager
Swift Package Manager (SPM) 4.2
Swift Package Manager PackageDescription 4.2 wprowadza obsługę lokalnych zależności .
Uwaga: spodziewam się, ale jeszcze nie przetestowałem, że w SPM 4.2 powinno być możliwe coś takiego:
źródło
W swift Swift 3 składnia
self.dynamicType
jest przestarzała, użyj jej zamiast tegolub
źródło
Potwierdź, że zasób został dodany do celu testowego.
źródło
jeśli masz wiele celów w swoim projekcie, musisz dodać zasoby między różnymi celami dostępnymi w członkostwie docelowym i może być konieczne przełączanie między różnymi celami, jak pokazano 3 kroki na poniższym rysunku
źródło
Musiałem upewnić się, że pole wyboru Testowanie ogólne jest ustawione
źródło