ios xcode linker xcode-ui-testing xcode7.1

ios - Error de vinculador al acceder al módulo de la aplicación en las pruebas de interfaz de usuario en Xcode 7.1



linker xcode-ui-testing (3)

Las pruebas de UI son un módulo separado de la aplicación, por lo tanto, no se ejecutan dentro de su aplicación como lo haría una prueba lógica. La única forma en que pueden compartir código es compilar todos los archivos de aplicaciones que necesita compartir entre los dos módulos. Consulte este blog para saber cómo puede lograrlo, https://www.bignerdranch.com/blog/ui-testing-in-xcode-7-part-1-ui-testing-gotchas/

También se encontró un radar archivado aquí, https://openradar.appspot.com/23116258

Estoy tratando de implementar algunas pruebas de interfaz de usuario en mi proyecto. Todo va bien mientras lo mantenga simple: registre el caso de prueba, agregue algunas afirmaciones y luego ejecute la prueba. Esto funciona bien, sin embargo, cuando intento acceder al módulo de la aplicación desde dentro de mi prueba, el vinculador genera un error (vea a continuación):

En el archivo fuente de la aplicación:

func foo() { assert(true) }

En las pruebas de la interfaz de usuario:

import XCTest @testable import MyApp func testExample() { foo() }

Error:

Símbolos no definidos para la arquitectura i386: "MyApp.foo () -> ()", referenciado desde: MyAppUITests.MyAppUITests.testExample (MyAppUITests.MyAppUITests) () -> () en MyAppUITests.o ld: symbol (s) no se encuentra para arquitectura i386 clang: error: el comando del vinculador falló con el código de salida 1 (use -v para ver la invocación)

Símbolos no definidos para la arquitectura x86_64: "MyApp.foo () -> ()", referenciado desde: MyAppUITests.MyAppUITests.testExample (MyAppUITests.MyAppUITests) () -> () en MyAppUITests.o ld: symbol (s) no se encuentra para arquitectura x86_64

He encontrado un problema similar aquí: https://forums.developer.apple.com/thread/20609 pero no hay solución. Me parece que el @testable simplemente no funciona correctamente. El tipo en developer.apple.com intentó solucionar el problema agregando el Host de prueba y el Cargador de paquetes en la configuración, pero no creo que este sea el enfoque correcto. Creo que el @testable debería hacer que todo funcione, y no parece @testable en este momento. Cualquier ayuda apreciada!


@testable import <yourApp> podría estar causando este error. Sólo saca la línea. No es necesario para las pruebas de interfaz de usuario.

"Las pruebas de interfaz de usuario se ejecutan fuera de su aplicación en un proceso separado. No puede acceder al código de la aplicación desde una prueba de interfaz de usuario, esto es parte del diseño intencionalmente. Utilice pruebas de unidad para las pruebas que necesitan acceder al código de la aplicación y las pruebas de interfaz de usuario para automatizar el usuario pruebas de interacción

Observe que a los 6 minutos, @testable no es utilizado por los desarrolladores de Apple. https://www.youtube.com/watch?v=7zMGf-0OnoU&t=1316s


@testable import MainModule no funcionará para la prueba de la interfaz de usuario, aunque habilitará la finalización del código (puede hacerte sentir que funciona). Está diseñado solo para pruebas de unidad hasta el momento. Y llevaría a construir fallas, algo como:

ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

La solución es agregar el archivo de código fuente al objetivo de prueba de la IU también, entonces funcionará de forma @testable import (incluso sin la @testable import ).

File Inspector -> Target Membership -> verifique el objetivo de la prueba de la interfaz de usuario (además del objetivo principal)

Espero que Apple lo arregle pronto para que podamos tener una forma más limpia de usarlo.