ios - team - Error del enlazador de prueba de la unidad Xcode 4
ios app development (9)
NOTA: "Use GHUnit" no es una respuesta aceptable para esta pregunta. Sé que la mayoría piensa que GHUnit es mejor que Xcode4 OCUnit, pero no es eso lo que estoy preguntando. Lo evaluaré por separado.
Tengo un proyecto Xcode que creé en Xcode4 desde cero, con la casilla de verificación "Incluir pruebas unitarias" marcada durante la creación. También he incluido algunas bibliotecas que desarrollé en un proyecto anterior. Se agregaron al proyecto a través del cuadro de diálogo "Agregar archivos a x ..." y solo se agregaron al objetivo de la aplicación (no al objetivo de prueba). Funcionan bien cuando se ejecuta la aplicación, así que creo que están configurados correctamente. También tengo varias clases escritas para este proyecto.
Mis archivos de prueba se configuran de forma estándar, denominados [AppName] Tests.hy .m.
Código para el encabezado:
#import < SenTestingKit/SenTestingKit.h >
@interface [AppName]Tests : SenTestCase {
@private
}
@end
Código para la implementación:
#import "[AppName]Tests.h"
@implementation [AppName]Tests
- (void)setUp
{
[super setUp];
// Set-up code here.
}
- (void)tearDown
{
// Tear-down code here.
[super tearDown];
}
// Test methods go here
@end
Que es sólo el esqueleto básico. Funciona bien en mi otro proyecto, y en este proyecto siempre y cuando no importe ningún otro archivo. Cuando importo otro archivo de este proyecto y lo uso, veo el siguiente error en el registro de salida de Xcode:
The test bundle at /Users/[Me]/Library/Developer/Xcode/DerivedData/[AppName]-dwuuuwcpmdqxqmgxomoniplwhlpb/Build/Products/Debug-iphonesimulator/[AppName]Tests.octest could not be loaded because a link error occurred. It is likely that dyld cannot locate a framework framework or library that the the test bundle was linked against, possibly because the framework or library had an incorrect install path at link time.
Ya he verificado que:
- Todos los marcos que uso se agregaron a "Vincular binarios con bibliotecas" tanto para la aplicación como para los objetivos de prueba.
- El objetivo de la prueba se ha configurado para compilar correctamente y todos mis métodos de prueba se muestran en Editar esquema ...-> Prueba-> Pruebas
- Todos los problemas, pero este ha sido resuelto y no hay errores de compilación.
- Todas las configuraciones discutidas here están configuradas correctamente e idénticas a mi otro proyecto que prueba correctamente.
¿Alguna idea sobre lo que podría estar causando esto?
Acabo de perder horas en esto y errores similares (resulta que me había cambiado el nombre de mi objetivo principal), los intentos de solucionarlo cambiando el nombre de las variables relevantes y eliminando todo el directorio DerivedData no tuvieron éxito.
Finalmente, simplemente configuro un nuevo objetivo de prueba de unidad siguiendo los pasos aquí: http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/
Y todo está bien ahora.
Por lo tanto, si tiene errores de enlace extraños e inexplicables, es mejor que cree un nuevo objetivo de prueba de unidad. Sólo toma 2 minutos.
Asegúrese de que el destino de prueba tenga el destino de la aplicación configurado como una dependencia (Fases de compilación -> Dependencias de destino).
Cuando recibo errores del enlazador al ejecutar pruebas unitarias, hay dos cosas que me solucionan el problema. La primera solución es establecer la configuración de compilación Prueba después de compilar en SÍ y elegir Producto> Compilar para> Construir para prueba para ejecutar las pruebas. Esta solución es la más fácil de implementar.
La segunda solución es agregar los archivos de implementación de la aplicación al objetivo de prueba de la unidad. Abra el inspector de archivos seleccionando Ver> Utilidades> Inspector de archivos. Seleccione un archivo de implementación en el navegador de proyectos. Seleccione la casilla de verificación junto al objetivo de prueba de unidad en el inspector de archivos.
Para las aplicaciones de iPhone que se ejecutan en el simulador, asegúrese de que la configuración de compilación del Host de prueba esté en blanco. El simulador no admite pruebas de unidad alojadas en la aplicación.
Encontré este error al ejecutar Xcode 4.5.2, es noviembre de 2012, ninguno de los anteriores funcionó. Parece que configurar el cargador de paquetes y el host de prueba debe completar todas las dependencias de su proyecto por usted, o ejecutar las pruebas en el entorno de su aplicación o algo así, pero desafortunadamente no funcionó para mí. Lo que hizo fue evitar las advertencias específicas de Xcode sobre qué archivos / bibliotecas faltaban.
Lo que funcionó para mí fue agregar un nuevo objetivo: prueba de unidad táctil de cacao (asegurándose de que la configuración de compilación del host de prueba y el cargador de paquetes estuvieran vacíos), ver los errores de compilación y agregar manualmente las dependencias faltantes, uno por uno, todos los archivos de origen de Mi proyecto que se necesitaba y luego los marcos. No muy elegante, pero estaba feliz de que funcionara. No estoy seguro de por qué no he probado esta biblioteca GHUnit todavía.
Hice lo siguiente:
http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/
Eche un vistazo más profundo a Test_Hosts = $ (BUNDLE_LOADER)
¡La configuración de Test_Hosts solucionó exactamente el mismo problema!
Me he encontrado con esto después de varias combinaciones últimamente donde un compañero de trabajo y yo hemos agregado archivos al proyecto, y no todos los archivos de implementación son miembros del objetivo de prueba de la unidad.
La solución:
- Seleccione un pequeño rango de sus archivos
.m
(use "Filter in Navigator" (cmd-opt-j) para buscar.m
) - Mostrar el inspector de archivos (cmd-opt-1) para ver las membresías de destino de los archivos
- Asegúrese de que los archivos apropiados sean miembros de su objetivo de prueba.
Nota: si la casilla de verificación del objetivo de prueba muestra -
lugar de +
o sin marcar, significa que algunos, pero no todos, los archivos seleccionados son miembros del objetivo.
He intentado hacer cosas más inteligentes en el momento de combinarlas con el archivo project.pbxproj
.xcodeproj
, pero he renunciado a la frustración por su inescrutabilidad cada vez y he .xcodeproj
a este método.
(Otra nota: solo selecciono unos pocos archivos a la vez por dos razones:
- El rendimiento de Xcode para el inspector de archivos cuando se seleccionan más de 7-10 archivos es pobre
- Algunos archivos no son y no deberían ser miembros del objetivo de prueba, y es más fácil hacer un proceso de eliminación cuando el rango seleccionado es pequeño)
Soy consciente de que esta pregunta es bastante antigua, pero luché con un problema idéntico durante un tiempo y finalmente logré resolverlo, así que permítame compartir lo que encontré.
He estado portando una aplicación de iOS a Mac, el proyecto se creó para iOS, por lo que tanto el proyecto como el objetivo principal tenían iOS en las plataformas compatibles. Ahora, cuando comencé a portar, creé un nuevo destino para Mac y cambié las plataformas compatibles a OSX solo para ese objetivo. Después de eso, creé otro objetivo para las pruebas unitarias, pero olvidé cambiar las plataformas compatibles de iOS a Mac. Creo que ya debería saber cuál era el problema, básicamente, el objetivo de las pruebas unitarias está vinculado por defecto con el marco Cocoa, por lo que, dado que las plataformas compatibles para este objetivo eran solo iOS, el marco del cacao nunca se creó y no estaba correctamente vinculado. Cambiar las plataformas admitidas a OSX para el objetivo de prueba solucionó el problema.
Soy consciente de que esto puede no ser muy útil para los objetivos de prueba de iOS, pero al menos diríjase a la sección Enlace binario con bibliotecas de su objetivo de prueba y vea si hay bibliotecas rojas. Esto me dio la idea, quizás también ayude a algunos de ustedes.
Tuve este mismo problema una vez. Por alguna razón, uno de los archivos de origen de mi proyecto también se incluyó para compilarse para el objetivo de prueba, lo que provoca este error de enlace.
Al asegurarse de que solo se compilan los archivos de implementación de prueba, debe poder resolver este error. Puedes consultar esto en:
TestTarget -> Construir fases -> Compilar fuentes
Tuve que establecer la propiedad "Test Host" en el destino de prueba de la unidad en $(BUNDLE_LOADER)
. ¡Eso resolvió mi problema!