Me he estado golpeando la cabeza contra una pared con esto durante los últimos días, pero a pesar de las múltiples búsquedas en Google / SO / Github, ¡no puedo encontrar una solución a los problemas que tengo!
Todo lo que intento hacer es crear algunas pruebas unitarias para mi aplicación que utilizan los pods de Firebase.
Estoy usando Xcode 7.3.1 y Cocoapods 1.0.1. Actualización: el problema persiste con Xcode 8.0
Con este 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
En mi clase XCTest obtengo
Falta el módulo obligatorio "Firebase"
error en @testable import MyApp
Alternativamente con este 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
Las pruebas se compilan pero mi consola está llena de advertencias, por ejemplo:
La clase <-FirebaseClassName-> se implementa tanto en ... MyApp ... como en ... MyAppTests ... Se utilizará uno de los dos. Cual es indefinido
Respuestas:
Tuve el mismo problema. Lo resolví moviéndome
pod 'Firebase'
hacia mi objetivo de prueba. Cambie su Podfile a esto:fuente
pod install
.pod install
para actualizar las dependencias del proyecto;)Intente cambiar la herencia a
:complete
, como en:Es importante destacar que permite a cualquier otra persona que consulte su repositorio hacer
pod update
lo habitual sin tener que copiar.xcconfig
archivos u otro tipo de piratería solo para compilar.fuente
Ejemplo
fuente
El problema es que Firebase hace algo especial con las rutas de búsqueda de encabezado después de que CocoaPods genere su propio valor para la configuración, por lo que CocoaPods no detecta este cambio para trasladarlo al objetivo de prueba. Puede resolver esto de dos maneras:
Busque
MyAppTests.<configuration>.xcconfig
en el navegador de archivos y agregue lo siguiente aHEADER_SEARCH_PATHS
:${PODS_ROOT}/Firebase/Analytics/Sources
[*]Busque la configuración de Rutas de búsqueda de encabezado en Configuración de compilación y agregue el mismo valor que en la opción 1 a la lista. No debería necesitar configurarlo como recursivo.
* Según el comentario de AKM, esto cambió a
${PODS_ROOT}/Firebase/Core/Sources
en la versión 3.14.0fuente
${PODS_ROOT}/Firebase/Core/Sources
inherit! :search_paths
al objetivo de prueba enPodfile
.Tres pasos antes de que pudiera hacer que esto funcione:
CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0
Paso 1: asegúrese de agregar el siguiente bloque de destino en su podfile.
Paso 2: Dentro de la pestaña Configuración de compilación del navegador de proyectos de YourAppTests. Busque la fila Ruta de búsqueda de encabezado y agregue a Depurar la siguiente línea
Paso 3: en ejecución de terminal:
fuente
El problema se registra en el proyecto de base de fuego aquí:
https://github.com/firebase/firebase-ios-sdk/issues/58
Hay una solución alternativa:
pero esto también se soluciona actualizando a CocoaPods 1.4.0 o posterior, que es una mejor solución.
En el momento en que escribo esto (noviembre de 2017) cocoapods 1.4.0 todavía está en versión beta, por lo que para instalarlo debe solicitar explícitamente la versión beta:
Esto y luego
pod install
resolvió el problema al ejecutar mis pruebas.fuente
pod install
después de actualizar?pod install
resolvió mi problema! ¡Muchas gracias!La solución para mí fue actualizar cocoapods a la versión 1.1.0.rc.2.
sudo gem install cocoapods --pre
fuente
Probé todo lo anterior y encontré varios errores diferentes, originalmente comenzando con
Missing required module 'Firebase'
, luego obteniendo"Class ... is implemented in both ... "
o problemas con el vinculador si intentaba agregar Firebase Pods a mi objetivo de prueba.La solución que funcionó para mí fue:
$(inherited) non-recursive
$(SRCROOT)/Pods/Headers/Public recursive
$(SRCROOT)/Pods/Firebase recursive
En este punto, limpiar la carpeta de compilación, reconstruir y luego volver a ejecutar las pruebas funcionó para mí. ¡Espero que esto ayude a alguien!
fuente
La adición
${SRCROOT}/Pods/Firebase/CoreOnly/Sources
a las "rutas de búsqueda de encabezado" del objetivo de la prueba unitaria solucionó el problema. Pasos:Después de esto, las pruebas se pueden ejecutar y el error desaparecerá.
fuente
Tuve un problema similar. Expresado en términos de su pregunta, copié el contenido de mi
MyApp.<configuration>.xcconfig
archivo en miMyAppTests.<configuration>.xcconfig
archivo. Limpié y construí las pruebas, y funcionó.fuente
Agregue "$ {PODS_ROOT} / Firebase / Core / Sources" a su objetivo de pruebas solo en Configuración de compilación -> Rutas de búsqueda de encabezado
fuente
Como @Will mencionó un problema en torno a las rutas de búsqueda de encabezados después de la instalación de CocoaPods.
Tengo un proyecto con múltiples objetivos donde pod 'Firebase' incrustado en un módulo separado, digamos
MyProject-Shared
. Pod de Firebase en 'Podfile' instalado solo para el objetivo 'MyProject-Shared'. Otros módulos, que quieren usar 'MyProject-Shared' no se pueden compilar debido a un error:'Falta el módulo obligatorio "Firebase"'
El truco en mi caso fue agregar la siguiente ruta de búsqueda de encabezado faltante en la configuración de compilación de cada objetivo haciendo referencia a Analytics-Framework :
"${PODS_ROOT}/Firebase/CoreOnly/Sources"
Por favor, vea la imagen a continuación:
Espero que te ahorre tiempo.
fuente
Un método más simple que también funciona:
fuente
Missing required module Firebase
NO solución CocoaPodsPara aquellos que encuentran el mismo problema pero NO usan CocoaPods:
Si está utilizando Firebase, de lo que tiene alguna carpeta que contiene
Firebase.h
ymodule.modulemap
archivo. Por ejemplo -YOUR_PROJECT_DIR/Linking
Si el objetivo de su proyecto principal funciona correctamente, debe ir a ProjectSettings -> Targets. Seleccione el objetivo de prueba. Busque
User headers
y agregue la ruta aYOUR_PROJECT_DIR/Linking
. Seleccione larecursive
opción y debería estar listo para comenzar.Consulte la captura de pantalla para obtener más detalles:
fuente