XCTest / XCTest.h no se encuentra en proyectos antiguos construidos en Xcode 6

82

Tengo algunos proyectos que estoy tratando de construir con Xcode 6 Beta 2. Todos los proyectos tienen algún tipo de biblioteca que usa XCTest (Kiwi / XCTest y Specta) que no se compilan en Xcode 6 porque XCTest / XCTest.h no puede ser encontrado.

fatal error: 'XCTest/XCTest.h' file not found
#import <XCTest/XCTest.h>

Me di cuenta de que XCTest.framework ya no está en la lista de la fase de compilación de "Bibliotecas de enlaces con binarios", pero eso está bien porque cuando creo un nuevo proyecto con Xcode 6, parece que la biblioteca está vinculada automáticamente.

Quizás de cierta relevancia, todas mis dependencias que necesitan XCTest se incorporan a través de Cocoapods.

¿Hay algo que desconozco que necesito actualizar con mi proyecto?

Erik Kerber
fuente

Respuestas:

142

Nota: Es posible que esto no sea necesario para ningún proyecto creado en Xcode 7.

CocoaPods tenía una solución para esto aquí y aquí


Para solucionar este problema para cualquier dependencia de CocoaPod, debe agregar lo siguiente FRAMEWORK_SEARCH_PATHSen cualquier destino de Pod que requiera XCTest (por ejemplo, Kiwi, Specta, FBSnapshotTestCase, etc.).

$(PLATFORM_DIR)/Developer/Library/Frameworks

captura de pantalla

Esto le permitirá hacer referencia a XCTest en cualquier dependencia que pueda tener. Esto puede solucionarse en una actualización futura de CocoaPods o del Pod al que hace referencia, por lo que es posible que desee eliminarlo más tarde.

No es perjudicial para las versiones anteriores de Xcode, por lo que debería ser seguro de usar.

rana cuadrada
fuente
Gracias, rana cuadrada. El tema relevante está aquí
fatuhoku
1
¿Cuándo está programada la próxima versión?
fatuhoku
6
Esto no parece funcionar con KIM en xcode 6 GM ..?
Thomas Clowes
3
No estoy de acuerdo con "no relevante para Xcode 7". Tuve el problema en Xcode 7.1. El problema desapareció después de que agregué esa ruta de búsqueda de marco como se indicó anteriormente. Supongo que un proyecto iniciado en Xcode 7 no tendrá el problema, pero la pregunta aquí es construir proyectos más antiguos en Xcodes más nuevos.
Jerry Krinock
1
a partir de XCode 9, debe establecer la configuración de compilación FRAMEWORK_SEARCH_PATHS en $ (DEVELOPER_FRAMEWORKS_DIR) y $ (heredado)
berbie
40

Estaba moviendo archivos en un proyecto. Todo lo que tiene que hacer es seleccionar sus archivos de prueba, xxxTests.metc. y file inspectorseleccionar targetcomo testdestino normal y no como destino.

Jakub Truhlář
fuente
1
Exactamente lo que me pasó. No noté que cuando lo moví, el objetivo del archivo "cambió". Debería haberlo pensado en función de cómo se movió (eliminar en Xcode y volver a agregar). Gracias.
chadbag
1
respuesta simple que funcionó para mí. Tuve problemas al cambiar el nombre de mis archivos, y esta fue la solución en mi caso.
Simon
17

Me di cuenta de que XCTest está disponible solo para un objetivo de prueba (en Xcode 6). Si está utilizando XCTest para cualquier otro objetivo (por cualquier motivo), verá el XCTest.h not founderror.

Mustafa
fuente
Eso es. Cocoapods crea proyectos / objetivos de biblioteca estática. ¡Buen descubrimiento!
Erik Kerber
1
Lo más probable es que necesite mover todo el código relacionado con XCTest a un objetivo de prueba.
Mustafa
Lo cual es difícil si está utilizando CocoaPods para incluir Kiwi o Specta en su proyecto.
squarefrog
2
Entonces ... ¿cuál es la solución?
fatuhoku
12

Este error aparece cuando ha agregado un archivo en el que se utiliza XCTest fuera de un objetivo de prueba. Para solucionar esto en AppCode, puede hacer clic con el botón derecho en cualquier archivo sospechoso y seleccionar 'Administrar objetivos' y luego asegurarse de que solo esté marcado el objetivo de prueba.

Tash Pemhiwa
fuente
Me he encontrado con este problema más de una vez.
pshah
Esto me sucedió después de mover archivos en un proyecto y volver a agregarlos en el destino incorrecto.
Giles
11

@squarefrog tiene la respuesta correcta, pero tendrás que seguir haciéndolo manualmente cada vez que actualices tus pods :(

Si agrega esto a su archivo pod, automáticamente agregará la ruta adicional por usted. Por ejemplo, si quería añadir $(PLATFORM_DIR)/Developer/Library/Frameworksa la FRAMEWORK_SEARCH_PATHSde los espectros:

post_install do |installer|
    target = installer.project.targets.find { |t| t.to_s == "Pods-Tests-Specta" }
    if (target)
        target.build_configurations.each do |config|
            s = config.build_settings['FRAMEWORK_SEARCH_PATHS']
            s = [ '$(inherited)' ] if s == nil;
            s.push('$(PLATFORM_DIR)/Developer/Library/Frameworks')
            config.build_settings['FRAMEWORK_SEARCH_PATHS'] = s
        end
    else
        puts "WARNING: Pods-Tests-Specta target not found"
    end
end
decano Wombourne
fuente
Tenga en cuenta que es posible que deba cambiar "Pods-Tests-Specta"para que coincida con la configuración de su proyecto, o simplemente use el ciclo que @squarefrog sugirió para iterar sobre cada objetivo.
pix0r
1
Hablé mal: @squarefrog no sugirió un bucle. Lo que quiero decir es reemplazar las líneas 2-3 en la solución de @ deanWombourne con: installer.project.targets.each do |targetpara recorrer todos los objetivos y aplicar el cambio.
pix0r
2

Me he enfrentado al mismo problema después de un tiempo, importé el marco XCTest de las fases de compilación y resolví el problema.

Fases de construcción-> XCTest.Framework> limpiar y ejecutar. Espero que sea de ayuda para alguien ...

para su referencia ... Importar XCTest en un proyecto existente

Narasimha Nallamsetty
fuente
Esto funcionó para mí, pero también tuve que ir a la Configuración de destino para las nuevas pruebas y en la pestaña General marcar la casilla para probar las API de la aplicación.
Fran K.
1

En el momento de escribir este artículo, la última versión de Cocoapods (0.33.1) no tiene una solución para el problema.

Pero la versión de vanguardia sí.

Siga esta guía para configurar la última versión de Cocoapods desde la fuente. Llamo al mío pod-dev(cubierto en la guía) para distinguirlo de la versión de pods instalada con gemas.

El beneficio de este enfoque es que no necesita secuencias de comandos adicionales en su Podfile. Solo debes acordarte de hacer un en pod-dev installlugar de lo habitual pod install.

fatuhoku
fuente
1

La mejor manera de tener un XCTest es agregarlo desde Test Nagigator (quinto ícono en el panel izquierdo).

Actuando así, el nuevo archivo de prueba xx.m no apunta (en el panel derecho) a una aplicación (en el panel izquierdo> Target, Wrapper Extension: app), sino a un paquete (Wrapper Extension: xctest)

  • el XCTest.framework permanece en rojo,
  • debido a algunas modificaciones, puede tener el error 'XCTest/XCTest.h' file not found, es porque su archivo tenía que apuntar a una aplicación.
tontonCD
fuente
0

Esta es la solución más fácil que he encontrado. No es necesario realizar cambios en el proyecto. Y este cambio persistirá hasta su próxima actualización de Xcode:

cd /Applications/Xcode6-Beta7.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks
ln -s ../../../../../Library/Frameworks/XCTest.framework
Steven Kramer
fuente
La desventaja de esto es si comparte su proyecto con otros, ya que debe hacer que realicen esta acción, cada vez que haya una actualización de Xcode. Este es un problema con la implementación de Cocoapods, por lo que tiene sentido resolverlo usando Cocoapods.
squarefrog
Convenido. Y esto no es perfecto. Pero es muy fácil y se adapta bien a la cantidad de vainas que tienes (O (1)). Es mejor que también se limite el número de versiones de Xcode 6 :-)
Steven Kramer
Agregar la ruta a las rutas de búsqueda del marco no parece ser suficiente: las pruebas se compilarán, pero no se ejecutarán. Aparentemente, debido a que el paquete de prueba no pudo resolver el marco XCTest.
Steven Kramer
0

En un proyecto sin Cocoapods (por lo que no respondimos directamente a la pregunta del OP pero tal vez sea útil para mí o para otros en el futuro), tuvimos el mismo problema. Se resolvió reemplazando nuestros elementos OCTest anteriores con XCTest. Por ejemplo, un archivo MyApp.xcodeproj / project.pbxproj tiene esta diferencia (abreviada); - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

AnneTheAgile
fuente