2012-03-06 17 views
5

Intento utilizar OCMock por primera vez en mis casos de prueba. Es un proyecto Mac, integrado y dirigido a Lion, en Xcode 4.3. La aplicación principal y el paquete de pruebas tanto han ARC se activa, y por lo tanto cada vez que ejecuto las pruebas que veo el siguiente mensaje de registro:Error de OCMock en el tiempo de ejecución

GC: forcing GC OFF because OBJC_DISABLE_GC is set

Eso está bien, ya que estoy usando ARC por lo que don' No me importa GC. Cuando construyo mis pruebas unitarias, vinculadas con la última versión estable de OCMock (2.0.1), la compilación no tiene problemas. En tiempo de ejecución, después de la declaración de registro por encima, me sale el siguiente:

The test bundle at /Users/___/Library/Developer/Xcode/DerivedData/___-ayizwpehemunvodsdvczckkvarsh/Build/Products/Debug/___Tests.octest could not be loaded because its Objective-C runtime information does not match the runtime information required by the test rig. This is likely because the test rig is being run with Objective-C garbage collection disabled, but the test bundle requires Objective-C garbage collection. To enable Objective-C garbage collection for the test rig, run it in an environment without the OBJC_DISABLE_GC environment variable. 2012-03-06 10:29:32.812 otest[8486:203] *** NSTask: Task create for path '/Users/___/Library/Developer/Xcode/DerivedData/___-ayizwpehemunvodsdvczckkvarsh/Build/Products/Debug/___Tests.octest/Contents/MacOS/___Tests' failed: 22, "Invalid argument". Terminating temporary process.

El mensaje implica que la recolección de basura es la causa más común, pero como se ha mencionado, no hay manera de que estoy usando GC. Entonces, ¿qué otras configuraciones podrían estar arruinándome en tiempo de ejecución? No pensé que estuviera haciendo algo atípico, y revisé la configuración de mi proyecto de prueba para estar seguro, y no vi nada extraño.

actualización

que era capaz de reproducir esto con un nuevo proyecto vacío.

  1. Crear un nuevo proyecto y haga que la creación de pruebas unitarias, con ARC habilitado
  2. Borrar el ajuste Test Host de configuración de generación del lote de prueba de unidad
  3. Enlace al marco OCMock
  4. Ejecutar las pruebas, y presenciar el mismo error informé anteriormente

Además, cuando apago CRA y la recolección de basura requerida, a continuación, clang informa un error de enlazador mach-o, por lo que la compilación no tiene éxito. Si elimino el enlace al marco OCMock, se compila bien. Esto respalda mi pensamiento inicial de que el problema radica en otro lugar que no sea la recolección de basura.

+0

Se dice que probablemente no está funcionando porque GC esta apagado. "el paquete de prueba requiere la recolección de basura Objective-C". Intente no configurar OBJC_DISABLE_GC. – vakio

+0

@vakio el "paquete de prueba" es mi propio código de prueba, y usa ARC, que es la razón por la que GC está desactivado. Ese mensaje es solo una pista de lo que generalmente está mal en el entorno de tiempo de ejecución. Intenté habilitar GC, pero LLVM falla, probablemente porque ARC y GC no pueden coexistir. – Dov

Respuesta

18

he encontrado la respuesta, después de un día de buscar todo lo que podía pensar, en el Hamcrest tutorial (leer con más cuidado a través de la OCMock tutorial vinculado desde OCMock.org, se menciona allí, también). Por algún motivo, los marcos de trabajo de Hamcrest y OCMock deben copiarse en el directorio de productos. Entonces todo funciona como un encanto.

  1. Ir a la configuración de las pruebas Bundle
  2. Ir a los Fases Construir pestaña
  3. Haga clic en el Agregar Construir Fase botón y seleccione Añadir archivos de copia
  4. establecer el nuevo Copiar archivos compilar fases 'Destino a Directorio de productos
  5. Arrastra OCMock.marco del esquema del proyecto en la lista de archivos para la fase
  6. Arrastre la fase de copia de archivos por encima de la Ejecutar script fase

ejecutar sus pruebas como de costumbre

+1

Tanto OCHamrest como OCMock están construidos con '@ rpath' en la ruta del cargador. Esto los hace funcionar en el directorio de productos porque está en la ruta por defecto. Puede usar 'LC_RPATH' y otros medios para darle más flexibilidad. Consulte la discusión de '@ rpath' en la página del manual' dyld'. –

+0

Interesante, gracias por la explicación. – Dov

+0

Tuve el mismo problema con mi proyecto, que incluye el framework Growl. La solución fue la misma, ¡gracias! – mrwalker

Cuestiones relacionadas