Pruebas unitarias de Xcode con Cocoapods


119

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


Solo estaba usando Firebase Analytics. Después de pasar a Google Analytics, todo funciona a la perfección.
marosoaie

No he probado el suyo todavía, pero podría intentar incluir Firebase manualmente sin usar vainas de cocoa: firebase.google.com/docs/ios/setup#frameworks
Jonny

1
Esto sigue siendo un problema
Edward

Respuestas:


84

Tuve el mismo problema. Lo resolví moviéndome pod 'Firebase'hacia mi objetivo de prueba. Cambie su Podfile a esto:

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

Gracias, pero acabo de intentarlo y todavía tengo el problema "La clase ... está implementada en ambos ...".
Doovers

1
Funcionó para mí, pero todavía no tiene sentido para mí. No es la primera vez que puedo decir que Firebase está configurando sus podspecs de manera extraña, cf. twitter.com/dirtyhenry/status/836240557311684608 pero el equipo de Firebase no responde :(
Dirty Henry

4
Hacer este cambio no borró inmediatamente la advertencia, pero se resolvió después de ejecutar pod install.
blwinters

Medio problema resuelto. y la otra mitad se resuelve agregando "$ {PODS_ROOT} / Firebase / Core / Sources" a su objetivo de Tests solo en Build Settings -> Header Search Paths
ArgaPK

Después de realizar este cambio, no olvide ejecutar pod installpara actualizar las dependencias del proyecto;)
jawad

57

Intente cambiar la herencia a :complete, como en:

target 'MyAppTests' do
    inherit! :complete
end

Es importante destacar que permite a cualquier otra persona que consulte su repositorio hacer pod updatelo habitual sin tener que copiar .xcconfigarchivos u otro tipo de piratería solo para compilar.


1
Esto también tiene el problema "Clase ... se implementa en ambos ..."
Diogo T

Hizo desaparecer el error de tiempo de compilación, pero causó este en tiempo de ejecución: clang: error: el comando del vinculador falló con el código de salida 1 (use -v para ver la invocación)
CMont

¡Me funcionó a mi también! Gracias :)
smapps

52
  1. Seleccione su configuración de objetivo de prueba unitaria.
  2. Vaya a Configuración de compilación.
  3. Busque rutas de búsqueda de encabezado.
  4. Agregue este valor $ (SRCROOT) / Pods con recursivo, luego Xcode resolverá la ruta por usted.

Ejemplo


1
Gracias @Kanika Sharma
Rahul K Rajan

34

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:

  1. Busque MyAppTests.<configuration>.xcconfigen el navegador de archivos y agregue lo siguiente a HEADER_SEARCH_PATHS:

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

  2. 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/Sourcesen la versión 3.14.0


Intenté eso, pero sigo recibiendo las mismas advertencias
cambios

8
A partir de Firebase 3.14.0 Esta solución es válida, sin embargo, el parche cambió a${PODS_ROOT}/Firebase/Core/Sources
AKM

1
¡El nuevo camino funcionó para mí también! Estoy ejecutando CocoaPods versión 1.2.0 , pero tenga en cuenta que también tuve que agregar inherit! :search_pathsal objetivo de prueba en Podfile.
Paulo Mattos

2. no me funciona. Usando Firebase 3.x (no el 4.x más nuevo)
Jonny

El problema se puede seguir aquí: github.com/firebase/firebase-ios-sdk/issues/58
CMont

7

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.

# 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

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

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

Paso 3: en ejecución de terminal:

actualización de la vaina


7

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:

Agregue "$ {PODS_ROOT} / Firebase / Core / Sources" a su objetivo de pruebas solo en Configuración de compilación -> Rutas de búsqueda de encabezado

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:

gem install cocoapods --pre

Esto y luego pod installresolvió el problema al ejecutar mis pruebas.


1
¿Qué es "PODS_ROOT"?
ArgaPK

@ArgaPK Es una variable que establece cocoapods. Simplemente pegue exactamente lo que escribí entre las "" en Xcode. Realmente, la mejor manera es actualizar sus CocoaPods a> = 1.4.0.
JosephH

1
@JosephH actualizar mis cocoapods a 1.5.2 no resolvió el problema, desafortunadamente.
Stacy Smith

@AnastasiaKovaleva, ¿corriste pod installdespués de actualizar?
JosephH

@JosephH ¡Correr pod installresolvió mi problema! ¡Muchas gracias!
Stacy Smith

4

La solución para mí fue actualizar cocoapods a la versión 1.1.0.rc.2.

sudo gem install cocoapods --pre


Desafortunadamente, no funciona para mí ... ¡Tengo que retirar mi voto a favor!
Zeb

Lo siento, no los ayudó chicos, no estoy seguro de por qué resolvió el problema para mí y no para ustedes ...
Doovers

Estoy en 1.20 y no
tuve

4

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:

  1. Elimine el objetivo de prueba por completo de Podfile y ejecute la 'actualización de pod' para asegurarse de que el proyecto XCode esté sincronizado.
  2. Abra la configuración de compilación de mi objetivo de prueba y actualice las rutas de búsqueda del encabezado para incluir solo los siguientes 3 elementos:
    • $(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!


Después de probar todo lo demás en este hilo, esta fue la única respuesta que hizo que las cosas funcionaran para mí. ¡Gracias!
Ali Parr

4

La adición ${SRCROOT}/Pods/Firebase/CoreOnly/Sourcesa las "rutas de búsqueda de encabezado" del objetivo de la prueba unitaria solucionó el problema. Pasos:

  1. Seleccione su objetivo de pruebas unitarias
  2. Ir a Configuración de compilación
  3. Buscar la ruta de búsqueda del encabezado
  4. Agregar $ {SRCROOT} / Pods / Firebase / CoreOnly / Sources

ingrese la descripción de la imagen aquí

Después de esto, las pruebas se pueden ejecutar y el error desaparecerá.


2

Tuve un problema similar. Expresado en términos de su pregunta, copié el contenido de mi MyApp.<configuration>.xcconfigarchivo en mi MyAppTests.<configuration>.xcconfigarchivo. Limpié y construí las pruebas, y funcionó.


Esta fue la única solución que funcionó para mí. ¡Gracias! Estoy pensando en hacer un procesamiento posterior a la instalación en el Podfile haciendo esto
SauloT

1

Agregue "$ {PODS_ROOT} / Firebase / Core / Sources" a su objetivo de pruebas solo en Configuración de compilación -> Rutas de búsqueda de encabezado


Qué es ? PODS_ROOT
ArgaPK

buscará el directorio para el pod
Karthick Vadivel

1

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: Ruta de búsqueda de encabezado

Espero que te ahorre tiempo.


1

Un método más simple que también funciona:

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

    target :MyAppTests
end

0

Missing required module Firebase NO solución CocoaPods

Para aquellos que encuentran el mismo problema pero NO usan CocoaPods:

Si está utilizando Firebase, de lo que tiene alguna carpeta que contiene Firebase.hy module.modulemaparchivo. 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 headersy agregue la ruta a YOUR_PROJECT_DIR/Linking. Seleccione la recursiveopción y debería estar listo para comenzar.

Consulte la captura de pantalla para obtener más detalles:

ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.