iOS UnitTests: no se puede vincular a símbolos en mi objective de aplicación. ¿Qué pasa?

PREPARAR:
Xcode 4.5.2 (4G2008a)
OS X 10.7.5


Tengo un proyecto Xcode con un objective de Application iOS normal. Estoy intentando agregar un package de testing de unidad de ApplicationTests (NO un package de LogicTests ) como se describe en la documentation de Apple .

He seguido cuidadosamente los pasos proporcionados en la documentation, y he revisado todo varias veces. Sin embargo, no puedo crear el objective de ApplicationTests … falla con un error de Linker al intentar vincular a una de mis classs de Appliation. Parece como si establecer la configuration de compilation de Bundle Loader del objective ApplicationTests no funcionara. Pero AFAICT, he configurado esto correctamente, como lo describen los documentos de Apple.


MIS PASOS PARA REPRO:

  1. Siga la documentation de Apple para configurar un package ApplicationTests .
  2. Escriba un método de testing unitario en el objective ApplicationTests que importa y ejerce una class desde el objective de la Application (por ejemplo, MyAppClass ).
  3. Seleccione el destino de la aplicación en la window emergente Esquema y el simulador iPhone 6.0 en la window emergente de destino
  4. Product > Test

ESPERADO:
El simulador debería iniciarse y se deberían ejecutar mis ApplicationTests .

REAL:
El destino de ApplicationTests no se puede generar con el siguiente error:

 Undefined symbols for architecture i386: "_OBJC_CLASS_$_MyAppClass", referenced from: objc-class-ref in ApplicationTests.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Si MyAppClass references a MyAppClass en la testing de unidad, el package de ApplicationTests creará y se ejecutará correctamente.

Una vez más, parece que no he configurado correctamente la configuration de compilation de Bundle Loader en el objective de ApplicationTests , pero he vuelto a verificar, y parece que he seguido correctamente las instrucciones de Apple.

¿Qué podría haber hecho mal para que mi objective ApplicationTests no pueda vincular a símbolos en mi objective de Application ?


Actualización : también he intentado crear nuevos proyectos ficticios desde cero con los objectives Application y ApplicationTests . En los proyectos ficticios, agrego una class MyAppClass al objective de la Application , y puedo vincularme a ella y ejecutar con éxito las testings unitarias que utilizan MyAppClass en el objective ficticio de ApplicationTests .

Entonces, las testings de aplicación en mis proyectos ficticios funcionan. Pero no funcionan en mi proyecto real. He comparado los Objetivos en los proyectos ficticios y reales y no puedo encontrar una diferencia significativa que pueda causar este problema solo para mi proyecto real.

Mi proyecto real es bastante antiguo (pero también muy complejo, por lo que sería muy difícil volver a empezar). Me pregunto si la antigüedad del proyecto impide que funcione esta característica relativamente nueva.

Todavía me parece que tengo un problema de configuration de compilation en uno de los objectives en mi proyecto real. Pero no puedo encontrarlo.

¿Puedes intentar abrir el proyecto con Xcode 5.0? Seleccione el objective de testing de la unidad en la configuration del proyecto / objective, abra la pestaña "General" y compruebe si el "Objetivo" seleccionado es su objective de aplicación principal.

Ahí es donde Xcode obtiene la información que debe vincular al cargador de packages de testing de unidad.

Pregunta relacionada: Prueba de unidad con una biblioteca estática

En resumen, independientemente de usar SenTest o XCTest, debe asegurarse de que

  • Su proyecto principal se establece como una dependencia de su objective de testing

  • Si su objective principal es una biblioteca estática, el producto de la biblioteca del objective principal debe includese en el link with binary libraries del objective de testing link with binary libraries fases de compilation de link with binary libraries

Si se pierden (o ambos) de estos, se puede producir este error.