Testowanie jednostkowe Xcode z Cocoapods


120

Przez ostatnie kilka dni walę głową w ścianę, ale pomimo wielu wyszukiwań w Google / SO / Github nie mogę znaleźć rozwiązania problemów, które mam!

Wszystko, co próbuję zrobić, to utworzyć testy jednostkowe dla mojej aplikacji, która korzysta z podów Firebase.

Używam Xcode 7.3.1 i Cocoapods 1.0.1. Aktualizacja: problem pozostaje w Xcode 8.0

W tym pliku podfile:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
    end
end

W mojej klasie XCTest dostaję

Brak wymaganego modułu „Firebase”

błąd w @testable import MyApp

Alternatywnie z tym plikiem podfile:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

def common_pods
    pod 'SwiftyTimer'
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'
end

target 'MyApp' do
    common_pods
end

target 'MyAppTests' do
    common_pods
end

Testy się budują, ale moja konsola jest zaśmiecona ostrzeżeniami, np .:

Klasa <-FirebaseClassName-> jest zaimplementowana w obu… MyApp… i… MyAppTests… Jeden z dwóch zostanie użyty. Który jest nieokreślony


Używałem tylko Firebase Analytics. Po przejściu do Google Analytics wszystko działa jak urok.
marosoaie

Sam jeszcze nie próbowałem, ale mogę spróbować włączyć Firebase ręcznie, nie używając kapsułek kakaowych: firebase.google.com/docs/ios/setup#frameworks
Jonny

1
To wciąż jest problem
Edward,

Odpowiedzi:


84

Miałem ten sam problem. Rozwiązałem to, przechodząc pod 'Firebase'do celu testowego. Zmień swój plik Podfile na ten:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
        pod 'Firebase'
    end
end

Dzięki, ale właśnie to wypróbowałem i nadal mam problem „Klasa… jest zaimplementowana w obu…”.
doovers

1
U mnie to zadziałało, ale nadal nie ma dla mnie sensu. To nie pierwszy raz, kiedy mogę powiedzieć, że Firebase dziwnie konfiguruje swoje podspeki, por. twitter.com/dirtyhenry/status/836240557311684608, ale zespół Firebase nie odpowiada :(
Dirty Henry

4
Wprowadzenie tej zmiany nie spowodowało natychmiastowego usunięcia ostrzeżenia, ale zostało rozwiązane po uruchomieniu pod install.
blwinters

Połowa problemu rozwiązana. a druga połowa jest rozwiązana przez dodanie „$ {PODS_ROOT} / Firebase / Core / Sources” do celu
Testów

Po wprowadzeniu tej zmiany nie zapomnij uruchomić pod installw celu zaktualizowania zależności projektu;)
jawad

57

Spróbuj zmienić dziedziczenie na :complete, jak w:

target 'MyAppTests' do
    inherit! :complete
end

Co ważne, pozwala każdemu, kto przegląda twoje repozytorium, po prostu zrobić tak pod updatejak zwykle, bez konieczności kopiowania .xcconfigplików lub innych hakerów tylko w celu kompilacji.


1
Ma to również miejsce w wydaniu "Klasa ... jest zaimplementowana w obu ..."
Diogo T

Zniknął błąd czasu kompilacji, ale spowodował ten w czasie wykonywania: clang: error: polecenie konsolidatora nie powiodło się z kodem zakończenia 1 (użyj -v, aby zobaczyć wywołanie)
CMont

U mnie też zadziałało! Dzięki :)
smapps

52
  1. Wybierz ustawienie celu testu jednostkowego.
  2. Przejdź do ustawień kompilacji.
  3. Poszukaj ścieżek wyszukiwania nagłówków.
  4. Dodaj tę wartość $ (SRCROOT) / Pods z rekurencją, a Xcode rozwiąże za Ciebie ścieżkę.

Przykład


1
Dziękuję @Kanika Sharma
Rahul K Rajan

34

Problem polega na tym, że Firebase robi coś specjalnego ze ścieżkami wyszukiwania nagłówka po tym, jak CocoaPods generuje własną wartość dla ustawienia, więc CocoaPods nie wychwytuje tej zmiany, aby przenieść ją do celu testowego. Możesz rozwiązać ten problem na dwa sposoby:

  1. Zlokalizuj MyAppTests.<configuration>.xcconfigw nawigatorze plików i dodaj następujące elementy do HEADER_SEARCH_PATHS:

    ${PODS_ROOT}/Firebase/Analytics/Sources [*]

  2. Znajdź ustawienie Ścieżki wyszukiwania nagłówków w Ustawieniach kompilacji i dodaj do listy tę samą wartość, co w opcji 1. Nie powinieneś ustawiać go jako rekurencyjnego.

* Zgodnie z komentarzem AKM, zmieniło się to ${PODS_ROOT}/Firebase/Core/Sourcesw wersji 3.14.0


Próbowałem, ale wciąż otrzymuję te same ostrzeżenia
doovers

8
Od Firebase 3.14.0 To rozwiązanie jest prawidłowe, jednak poprawka została zmieniona na${PODS_ROOT}/Firebase/Core/Sources
AKM

1
U mnie też zadziałała nowa ścieżka! Używam CocoaPods w wersji 1.2.0 , ale pamiętaj, że musiałem również dodać inherit! :search_pathsdo celu testowego w Podfile.
Paulo Mattos

2. u mnie nie działa. Korzystanie z Firebase 3.x (nie najnowszego 4.x)
Jonny

Problem można śledzić tutaj: github.com/firebase/firebase-ios-sdk/issues/58
CMont

7

Trzy kroki, zanim to zadziała:

CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0

Krok 1: Upewnij się, że dodałeś następujący blok docelowy do pliku podfile.

# Uncomment the next line to define a global platform for your project
platform :ios, '11.3'

target 'TIMII' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!

# Pods for TIMII
pod 'Firebase/Core'
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'Firebase/Storage'

    target 'TIMIITests' do
        inherit! :search_paths
        pod 'Firebase/Core'
    end

end

Krok 2: Na karcie Ustawienia kompilacji nawigatora projektu YourAppTests. Znajdź wiersz ścieżki wyszukiwania nagłówka i dodaj do debugowania następujący wiersz

$ (inherited) $ {PODS_ROOT} / Firebase / Core / Sources

Krok 3: W trybie terminala:

aktualizacja pod


7

Problem został odnotowany w projekcie Firebase tutaj:

https://github.com/firebase/firebase-ios-sdk/issues/58

Istnieje obejście:

Dodaj „$ {PODS_ROOT} / Firebase / Core / Sources” do celu testów tylko w Ustawieniach kompilacji -> Ścieżki wyszukiwania nagłówków

ale jest to również naprawiane poprzez aktualizację do CocoaPods 1.4.0 lub nowszej, która jest lepszym rozwiązaniem.

W chwili, gdy to piszę (listopad 2017), cocoapods 1.4.0 jest nadal w wersji beta, więc aby go zainstalować, musisz wyraźnie zażądać wersji beta:

gem install cocoapods --pre

To, a następnie wykonanie pod installmoich testów, rozwiązało problem.


1
co to jest „PODS_ROOT”?
ArgaPK

@ArgaPK To zmienna, którą ustawia cocoapods. Po prostu wklej dokładnie to, co napisałem między znakami „” do Xcode. Naprawdę najlepszym sposobem jest uaktualnienie CocoaPods do> = 1.4.0.
JosephH

1
@JosephH aktualizacja moich cocoapodów do wersji 1.5.2 nie rozwiązała niestety problemu.
Stacy Smith

@AnastasiaKovaleva czy biegałeś pod installpo aktualizacji?
JosephH

@JosephH Running pod installrozwiązał mój problem! Wielkie dzięki!
Stacy Smith

4

Rozwiązaniem dla mnie była aktualizacja cocoapods do wersji 1.1.0.rc.2.

sudo gem install cocoapods --pre


Niestety to nie działa dla mnie ... Muszę cofnąć mój głos za!
Zeb

Przepraszam, że wam to nie pomogło, nie jestem pewien, dlaczego rozwiązało problem dla mnie, a nie dla was ...
doovers

Jestem na 1.20 i nie mam szczęścia
UKDataGeek

4

Wypróbowałem wszystkie powyższe i napotkałem różne błędy, początkowo zaczynając od Missing required module 'Firebase', a następnie otrzymując "Class ... is implemented in both ... "lub łącząc problemy, gdy próbowałem dodać Firebase Pods do mojego celu testowego.

Rozwiązaniem, które zadziałało dla mnie, było:

  1. Usuń całkowicie cel testowy z Podfile i uruchom „aktualizację pod”, aby upewnić się, że projekt XCode jest zsynchronizowany.
  2. Otwórz ustawienia kompilacji celu testowego i zaktualizuj ścieżki wyszukiwania nagłówków, aby zawierały tylko następujące 3 elementy:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

W tym momencie wyczyszczenie folderu kompilacji, ponowne kompilowanie i ponowne uruchomienie testów zadziałało. Mam nadzieję, że to komuś pomoże!


Po wypróbowaniu wszystkiego innego w tym wątku - to była jedyna odpowiedź, która sprawiła, że ​​wszystko działało dla mnie. Dziękuję Ci!
Ali Parr

4

Dodanie ${SRCROOT}/Pods/Firebase/CoreOnly/Sourcesdo „ścieżek wyszukiwania nagłówków” celu testu jednostkowego rozwiązało problem. Kroki:

  1. Wybierz cel testów jednostkowych
  2. Przejdź do ustawień kompilacji
  3. Wyszukaj ścieżkę wyszukiwania nagłówka
  4. Dodaj $ {SRCROOT} / Pods / Firebase / CoreOnly / Sources

wprowadź opis obrazu tutaj

Po tym testy mogą zostać uruchomione, a błąd zniknie.


2

Miałem podobny problem. Zgodnie z twoim pytaniem skopiowałem zawartość mojego MyApp.<configuration>.xcconfigpliku do mojego MyAppTests.<configuration>.xcconfigpliku. Wyczyściłem i zbudowałem testy i zadziałało.


To było jedyne rozwiązanie, które działało dla mnie. Dzięki! Myślę o zrobieniu tego po instalacji w Podfile
SauloT


1

Jak @Will wspomniał o problemie ze ścieżkami wyszukiwania nagłówków po instalacji CocoaPods.

Mam projekt z wieloma celami, w których pod 'Firebase' jest osadzony w oddzielnym module, powiedzmy MyProject-Shared. Moduł Firebase w „Podfile” zainstalowany tylko dla celu „MyProject-Shared”. Inne moduły, które chcą używać „MyProject-Shared”, nie mogą zostać skompilowane z powodu błędu:

„brak wymaganego modułu„ Firebase ””

Sztuczka w moim przypadku polegała na dodaniu następującej brakującej ścieżki wyszukiwania nagłówka w ustawieniach kompilacji każdego celu, które odnoszą się do platformy Analytics :

"${PODS_ROOT}/Firebase/CoreOnly/Sources"

Zobacz zdjęcie poniżej: Ścieżka wyszukiwania nagłówka

Mam nadzieję, że pozwoli to zaoszczędzić czas.


1

Prostsza metoda, która również działa:

target 'MyApp' do
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target :MyAppTests
end

0

Missing required module Firebase NIE rozwiązanie CocoaPods

Dla tych, którzy napotykają ten sam problem, ale NIE używają CocoaPods:

Jeśli używasz Firebase, masz jakiś folder zawierający Firebase.hi module.modulemapplik. Na przykład -YOUR_PROJECT_DIR/Linking

Jeśli główny cel projektu działa poprawnie, powinieneś przejść do ProjectSettings -> Targets. Wybierz cel testowy. Wyszukaj User headersi dodaj ścieżkę do YOUR_PROJECT_DIR/Linking. Wybierz recursiveopcję i powinieneś być gotowy.

Zobacz zrzut ekranu, aby uzyskać więcej informacji:

wprowadź opis obrazu tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.