'El módulo no se compiló para probar' cuando se usa @testable


146

Estoy tratando de usar la nueva @testabledeclaración de Swift 2 para exponer mis clases al objetivo de prueba. Sin embargo, obtengo este error del compilador:

ingrese la descripción de la imagen aquí

Intervalses el módulo que contiene las clases que intento exponer. ¿Cómo me deshago de este error?

Respuestas:


239

En su objetivo principal, debe establecer la Enable Testabilityopción de compilación en Sí.

Según el comentario de @earnshavian a continuación, esto solo debe usarse en las compilaciones de depuración según las notas de la versión de Apple: "La configuración de compilación Habilitar Testability solo debe usarse en su configuración de depuración, ya que prohíbe las optimizaciones que dependen de no exportar símbolos internos de la aplicación o el marco " https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326


Hola, recibo el mismo error pero no veo la opción de habilitación de prueba y estoy usando xcode 7. ¿Alguna idea de lo que debo hacer?
user1601259

2
@ user1601259: puede encontrar la opción seleccionando el proyecto de nivel superior, yendo a Configuración de compilación y buscando debajo del encabezado Opciones de compilación.
hgwhittle

@hgwhittle: cuando selecciono el proyecto de nivel superior, todo lo que veo en las opciones de compilación es "formato de información de depuración" y "validar producto de compilación". Cuando selecciono el objetivo en las opciones de compilación, veo que "el contenido incrustado contiene un código rápido". Eso es. Cuando busco en la configuración de compilación, no puedo encontrarlo. ¿Esto se debe a xcode 7?
user1601259

1
Es posible que haya seleccionado "Básico" en su "Configuración de compilación". Si selecciona "Todos" en el lado izquierdo, verá "Habilitar la capacidad de prueba"
matriz del

1
¿Cómo debería funcionar esto exactamente para las versiones de lanzamiento, donde las pruebas se ejecutarán (si es necesario @testable) pero deben enviarse a la App Store? Si Enable Testabilityes solo para compilaciones de depuración, ¿cuál es la forma de evitar esto? ¿Tengo que extraer mi código de prueba para liberarlo?
timgcarlson

15

En mi caso, utilicé una configuración de compilación personalizada para las pruebas (llamada Test) y también cocoapodscomo administrador de dependencias

Tuve que agregar las siguientes líneas al final de mi Podfilepara permitir la capacidad de prueba

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            if config.name == 'Test'
                config.build_settings['ENABLE_TESTABILITY'] = 'YES'
            end
        end
    end
end

Por defecto cocoapodsconjuntos ENABLE_TESTABILITYa YESsólo para Debugconstrucciones



8

Para aquellos de ustedes que están experimentando esto solo al ejecutar Xcode Profiler: cambie la configuración de compilación de perfil en su administración de esquemas a la que tiene habilitada la capacidad de prueba, y eso sería una depuración en la mayoría de los casos:

ingrese la descripción de la imagen aquí


4

Esto probablemente se deba a que su objetivo principal Enable Testabilityestá establecido en NO. Debe configurarlo YESen el esquema de depuración (que se utiliza para ejecutar sus pruebas).

Si utiliza Carthage, este problema puede deberse a la importación de marcos con @testable, ya que se crean con un esquema de lanzamiento.

La mayoría de las veces es una mala práctica importar marcos con ese prefijo, por lo que podría evitarlo. Si no puede, debería hacerlo Enable Testabilityen el esquema de lanzamiento de los marcos. https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326


2
¿Cómo puedo evitar importar marcos usando @testable? ¿Cuál es la buena práctica aquí?
Jonathan Cabrera

3

Comencé a recibir este error al ejecutar pruebas con Bitrise.

A diferencia de lo que dicen otros usuarios, esto no es por Targetbase, o por Schemabase, es por Configurationbase. Seleccione Target-> Build Settingspestaña -> busque testability-> Habilítelo en la Configuración que está utilizando .

Tenga en cuenta que Apple recomienda habilitar esto en la configuración que está utilizando para la depuración, no para AppStore.


0

La solución anterior está bien si está utilizando vainas / Cartago. Pero si está utilizando marcos del propio iOS 'por ejemplo, Contactos', necesita agregar una ruta a estos marcos en 'Rutas de búsqueda de bibliotecas' del objetivo principal de su proyecto. ingrese la descripción de la imagen aquí


0

Si intentas probar el framework:

Vaya al objetivo de prueba -> Fase de compilación -> Crear nueva fase de copia de archivos -> Elegir marcos -> Agregar todos los marcos utilizados recursivamente


0

Si por casualidad tienes

install! 'cocoapods',
         generate_multiple_pod_projects: true,
         incremental_installation: true

Entonces, esta es la forma de hacerlo.

    # generated_projects only returns results if the we run "pod install --clean-install"
    # or install a pod for the first time

    installer.generated_projects.each do |project|
        project.build_configurations.each do |configuration|
            configuration.build_settings["ENABLE_TESTABILITY"] = "YES" 
        end
    end

-3

Esto no ocurrió en mis proyectos antes de Xcode 8, pero después de actualizar a Xcode 8, me dejó perplejo.

Las respuestas publicadas aquí no resolvieron mis problemas. Para mí, acabo de abandonar estas pruebas, ya que no es necesario. Así que desmarca los botones de prueba:

ingrese la descripción de la imagen aquí Y ahora el error se ha apagado.


1
Si no necesita las pruebas, podría ser mejor eliminar los objetivos de prueba de su proyecto en lugar de eliminarlos de todas las compilaciones.
Jonathan Cabrera
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.