"No existe tal módulo" cuando se usa @testable en las pruebas de la Unidad Xcode

168

Recientemente actualicé a Xcode 7 beta 5. Intenté agregar una prueba unitaria a un proyecto anterior, pero recibo el mensaje de error "No hay tal módulo [myModuleName]" en la @testable import myModuleNamelínea.

ingrese la descripción de la imagen aquí

Lo intenté

  • limpiar el proyecto con OptionClean Build Folder
  • comprobar que "Habilitar la capacidad de prueba" (depuración) se estableció en Sí en las Opciones de compilación
  • eliminar el objetivo de prueba y luego volver a agregar el paquete de prueba de la Unidad iOS

Nada de esto funcionó para este proyecto (pero he conseguido pruebas para trabajar en otro proyecto). ¿Alguien más ha tenido este problema y lo ha resuelto?

Suragch
fuente
Si está compilando desde la línea de comandos con xcodebuild, asegúrese de agregar el indicador -workspace para su comando de compilación. Resolví este problema en mi travis build de esa manera.
Victor 'Chris' Cabral

Respuestas:

210

Verifique el nombre del módulo con el que intenta importar @testable import "ModuleName". El nombre del módulo debe ser el mismo enTarget->Build Settings-> Product Module Name

Voda Ion
fuente
55
La mayor parte del caso, se trata del nombre del módulo del producto. Compruebe spacey_
onmyway133
55
ten cuidado con -y _. Uno de mis proyectos tiene menos -en el nombre, pero el módulo tiene subrayado en su _lugar
berilio el
44
""Expected identifier in import declaration
Utilicé
1
@ onmyway133 estaba súper cerca. En mi caso, tenía un nombre de módulo de producto diferente del nombre de mi proyecto. Para encontrar el nombre de su módulo, vaya a Build Settingsseleccionar su proyecto (no la prueba o la prueba de IU) y luego busque PRODUCT_MODULE_NAMElo que aparezca allí, lo que debe ir después@testable import
jonmecer
115

La respuesta que me funcionó

La respuesta fue que tuve algunos errores en mi proyecto que estaban haciendo que fallara la compilación. (Era solo su error estándar de todos los días en el código). Después de que solucioné los errores e hice otra limpieza y compilación, funcionó.

Tenga en cuenta que estos errores no aparecieron al principio. Para que aparezcan:

  • Comente todo su archivo de prueba que le está dando el error "No hay tal módulo".
  • Intenta ejecutar tu proyecto nuevamente.

Si hay otros errores, deberían aparecer ahora. Corríjalos y luego descomente su código de archivo de prueba. El error "No hay tal módulo" desapareció para mí.


En caso de que esto no resuelva el problema para otras personas, también puede intentar lo siguiente:

Limpia la carpeta de compilación

Abra el menú Producto, mantenga presionado Optiony haga clic en "Limpiar carpeta de compilación ..."

ingrese la descripción de la imagen aquí

Asegúrese de que Habilitar capacidad de prueba esté configurado en Sí

En el Navegador de proyectos, haga clic en el nombre de su proyecto. Seleccione Configuración de compilación y desplácese hacia abajo hasta Opciones de compilación. Asegúrese de que Habilitar la capacidad de prueba es Sí (para la depuración).

ingrese la descripción de la imagen aquí

Eliminar y volver a agregar su objetivo de Pruebas

Si has hecho las otras cosas, supongo que probablemente no necesites hacer esto. Pero si lo hace, recuerde guardar todas las pruebas unitarias que ya haya escrito.

Haga clic en el nombre de su proyecto en el Navegador de proyectos. Luego seleccione su objetivo de Pruebas. Haga clic en el botón menos (-) en la parte inferior para eliminarlo.

ingrese la descripción de la imagen aquí

Luego haga clic en el botón más (+) y elija Paquete de prueba de unidad iOS para agregarlo nuevamente. Como puede ver, también puede agregar un paquete de prueba de IU de la misma manera.

Algunas otras ideas

  • Asegúrese de que todas las clases requeridas sean miembros de su objetivo de prueba.
  • Asegúrese de haber agregado todas las bibliotecas necesarias.
  • Asegúrese de que el nombre del módulo esté escrito correctamente (vea esta respuesta ).

O...

Deje un comentario o una respuesta a continuación si encontró algo más que funcionó.

Relacionado

Suragch
fuente
2
Al tener todos los mismos problemas aquí, con Xcode 7 beta 5. Desafortunadamente, los pasos anteriores no parecen resolverlo: el módulo sigue considerando como "no existe tal módulo 'Utilidad'". La única diferencia con sus capturas de pantalla es que estoy tratando de hacer que esto funcione con la carpeta de pruebas de IU (GlimpulseUITests en mi caso). ¿@Testable no funciona con el objetivo de prueba de IU quizás?
Zac
55
*** IMPORTANTE *** Si elimina y vuelve a agregar su Objetivo de prueba, volverá a crear una plantilla de prueba en blanco que sobrescribirá sus pruebas existentes. Asegúrese de guardar sus fuentes de prueba antes de hacer esto.
Paul
2
Para mí, incluso mis clases individuales no se mostraban mientras escribía ... Finalmente hice Producto> Limpiar, reinicié XCode. Cuando se reinició, le dio unos segundos para completar la indexación y luego todas mis referencias aparecieron sin tener que incluir cada clase como miembro del objetivo de la prueba.
Rajive Jain
1
Además, si no lo ha intentado, haga clic en el marco que falta a la izquierda, luego a la derecha, seleccione "Membresía objetivo" e inclúyalo en el objetivo de prueba de la unidad.
albogdano 05 de
3
Vaya a la configuración de compilación de su objetivo principal -> "Nombre del módulo del producto" y vea si coincide con el nombre del módulo que intenta importar en su prueba.
f0rz
64

El problema para mí fue que el objetivo de implementación de iOS de las pruebas no estaba configurado para ser el mismo que el objetivo principal. Así que asegúrese de verificar esto.

En su objetivo de prueba:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
Encadenar
fuente
Después de hacer eso, tenía que establecer Enable Bitcodepara Noel paquete de prueba.
pableiros
2
Lol funciona, pero qué estúpido de xcode que no arroje un error diferente
J. Doe
31

Así es como hice que mi código funcione después de probar todas las soluciones sugeridas a partir de sugerencias anteriores.

  • Establecí 'Habilitar la capacidad de prueba' en 'SÍ' en la Configuración de compilación del proyecto
  • También configuré 'Define Module' en 'YES' en la configuración de compilación de mi proyecto.
  • Para los archivos .swift normales dentro de mi proyecto, digamos MyApp , iba a escribir casos de prueba, tengo tanto los objetivos principales " MyApp " como " MyAppUnitTests " marcados en Membresía de destino .
  • Luego seleccioné mi (s) archivo (s) de prueba de unidad, declaró la ' @testable import MyApp ' en la parte superior, debajo de ' import XCTest ', y solo verifiqué los "MyAppUnitTests" en Membresía de Target

Y todo funcionó a las mil maravillas. Espero que esto ayude.

Vick Swift
fuente
8
Habilitar la capacidad de prueba y el módulo Defines es lo que hizo el truco. No necesitaba cambiar las membresías de destino para los archivos regulares * .swift.
George Yacoub
Hice todos los pasos anteriores pero todavía no tengo el error de módulo. mi proyecto es una mezcla de obj c rápida
Mikael
@Mikael, ¿estás escribiendo pruebas solo para los archivos Swift en tu base de código de mezcla Objc / Swift? (Pregunto porque, la última vez que lo comprobé, creo que la 'importación de @testable' solo funcionó para escribir casos de prueba solo para archivos Swift, incluso en la mezcla de bases de código Obj-c / Swift. Probablemente ya haya cambiado. Alguien me corrigió si me equivoco aquí)
Vick Swift
66
Encontré mi problema. Fue porque la arquitectura válida de mi objetivo de prueba no era la misma que la configuración de la arquitectura válida de mi objetivo principal. Ahora funciona. Por cierto, estoy probando solo clases de Swift en mi caso, no lo intenté para Obj-c
Mikael
3
No debe agregar los archivos rápidos de la aplicación a su objetivo de prueba, ya que duplicará su contenido al ejecutar pruebas.
Przemysław Wrzesiński
18

Hay que tener en cuenta que si el nombre de su módulo tiene un carácter de guión -, tendrá que referirse a él con una barra inferior _. Por alguna razón sospeché que esto podría ser un problema y de hecho fue mi problema.

p.ej. @testable import Ocean-Swiftse convierte@testable import Ocean_Swift

Solo otra cosa, si usa la @testablesintaxis, asegúrese de no incluir su código de producción en su objetivo de prueba. He descubierto que esto causará rarezas inexplicables.

smileBot
fuente
1
Todos los caracteres no alfanuméricos también pueden necesitar ser reemplazados por el guión bajo. Mi objetivo estaba en este formato App (Dev), el módulo comprobable se convirtióApp__Dev_
Mushcraft
11

Esto parece ser un error con la configuración de compilación de ambos objetivos. Debe asegurarse de que:

  • ENABLE_TESTABILITY es igual a Sí para ambos objetivos.
  • El PRODUCT_MODULE_NAMEvalor del objetivo de la prueba debe diferir del de la aplicación.
yageek
fuente
2
Esto funcionó para mí. Estaba usando el nombre del módulo incorrecto. Estaba eliminando el espacio en lugar de agregar un _. DOBLE COMPRUEBE LOS NOMBRES DE LOS
MÓDULOS
9

Otra cosa que debe verificar: si tiene un proyecto Objective-C, pero está escribiendo pruebas unitarias en Swift, ¡asegúrese de que el objetivo principal use al menos un archivo Swift!


Más información:

Estaba trabajando en un proyecto Objective-C, pero quería escribir pruebas unitarias en Swift.

Agregué un archivo Swift al objetivo principal para generar el archivo ProjectName-Bridging-Header.h necesario, escribí mis pruebas y todo funcionaba correctamente.

Más tarde eliminé el archivo Swift porque pensé que no lo necesitaba (todo el código del objetivo principal está en Objective-C ... Solo estaba escribiendo pruebas en Swift).

No noté un problema hasta más tarde, después de que hice una "carpeta de compilación limpia / limpia" y apareció el problema "No hay tal módulo". Después de rascarme la cabeza, agregué un nuevo archivo Swift en blanco y el problema desapareció.

Lo he probado varias veces con / sin el archivo Swift, y solo funciona con él ... por lo tanto, tendré que dejar el archivo en blanco en el proyecto, convertir algunos Objective-C en Swift o agregar algunos nuevo código para el proyecto escrito en Swift.

Jim Rhoades
fuente
1
!! Después de 3 horas de limpieza, borrando datos resecados, limpiando, comenzando desde cero 3 veces, ¡encontré tu comentario que resolvió mi problema! Gracias !!!!
Maryam Fekri
¿Sabes cómo acceder a las clases de Objective-C en las clases de prueba de Swift, porque importo el módulo del proyecto y no hay ningún error con eso, pero todavía no reconoce mis clases de Objective-C? debería hacer otra cosa?
Maryam Fekri
Un punto adicional que me gustaría agregar, aunque mi proyecto ObjC en su mayoría tiene al menos un archivo Swift, no había un encabezado de puente para mi objetivo. Siguiendo las instrucciones en el siguiente enlace bajo el título "Importar código dentro de un objetivo de aplicación" se resolvió el acceso a las clases ObjC desde las pruebas de Swift. developer.apple.com/documentation/swift/…
palmi
Me encontré con este problema. Sin embargo, estoy interesado en encontrar una manera de evitar incluir el archivo Swift si es posible, así que hice la pregunta aquí: stackoverflow.com/q/62965954/211292
ThomasW
En realidad, parece que si no incluye la @testable import Foolínea, las pruebas unitarias deberían ejecutarse correctamente.
ThomasW hace
9

Para aquellos que se han desplazado hasta la última respuesta y todavía nada funcionó, esto es lo que hizo por mí después de seguir todos los consejos de otras respuestas. Estoy usando Xcode 11:

Lo que causó el problema en mi caso fue que cambié el nombre de mi producto

  1. Cambié el nombre de mi producto en la configuración de compilación de mi objetivo principal a "Nuevo nombre"
  2. Tuve que volver a seleccionar la aplicación de host para mi objetivo de prueba
  3. No sabía que cambiar el nombre del producto también cambiaría el Nombre del módulo del producto , que es el que se usa para importar el módulo en mis archivos de prueba. Cambié mi importación de la siguiente manera:

    @testable import New_Name

  4. Funcionó

Espero que ayude

SwissMark
fuente
7

Después de pasar un par de días en estos temas, finalmente llego a trabajar con mi proyecto. El problema estaba en el Encabezado de puente: la ruta en el objetivo de Pruebas no puede estar vacía si está usando el Encabezado de puente en su objetivo principal¡El encabezado de puente no puede estar vacío!

Espero que ahorre algo de tiempo para alguien.

Igor P
fuente
5

Asegúrese de que bajo la configuración de compilación del esquema de prueba, el objetivo de la prueba esté en la lista.

Junto al botón de reproducción, seleccione el esquema de prueba, luego Editar esquema ..., vaya a la sección Construir, haga clic en más + y seleccione el objetivo con el que desea probar.

En mi caso, tenemos un objetivo interno con el que desarrollamos (algunas diferencias menores) y después de una fusión, se eliminó de la configuración de prueba.

Editar esquema de prueba

BrianHenryIE
fuente
5

Aquí hay otra cosa para verificar que no está en la lista. Para mí, tenía algo que ver con mi equipo, ¡tal vez porque el Agente de nuestro equipo aún no había aceptado el último Acuerdo de licencia! Una vez que seleccioné un equipo diferente en la configuración general de mi objetivo, y luego especifiqué un objetivo de implementación específico como 12.1 u 11.0, de repente desapareció la advertencia "No hay tal módulo".

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Dave Levy
fuente
4

En mi caso, tuve 3 problemas. El primero fue que tenía que especificar la ruta de importación en:

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

El segundo fue que estaba usando Pods y tuve que importar estos pods a mis pruebas también usando:

target 'MyAppTests' do
    inherit! :complete
end

El tercero ya que estaba usando un encabezado de puente en mi objetivo, por lo tanto, tuve que especificar que el encabezado de puente fuera el mismo para la prueba.

el3ankaboot
fuente
2

Mi problema era que la clase que quería probar se suponía que estaba en un módulo separado (Cliente API), pero la clase era en realidad un miembro del objetivo de la aplicación y no el objetivo del marco. ¡Cambiar la membresía objetivo de la clase hizo que el error de importación desapareciera!

Maciej Swic
fuente
2

Entorno: Xcode Versión 9.0 (9A235)
Escenario: Prueba de un marco de código abierto.

Tuve el mismo problema: 'No hay tal módulo'.

Solución:

  1. Seleccione el objetivo de prueba.
  2. Seleccione Build Fases
  3. Agregue el marco para probar a través de Link Binary ...

ingrese la descripción de la imagen aquí

Aquí está el archivo de prueba: ingrese la descripción de la imagen aquí

Frederick C. Lee
fuente
2

Tuve el mismo problema. La limpieza de la carpeta de compilación y el reinicio de Xcode no funcionaron.

Lo que funcionó para mí fue asegurarme de que la configuración de "Construir solo arquitectura activa" de su objetivo y esquema de prueba coincida con la configuración del objetivo y esquema de su aplicación.

palmi
fuente
2

Seguí los pasos anteriores, que funcionaron. Sin embargo, mi proyecto tuvo algunos problemas más. Recibí esta advertencia y no pude acceder a las clases de mi proyecto principal para probar en mi objetivo de prueba.

Prueba parte del módulo - ignorando la importación

Descubrí que el Nombre del módulo del producto de destino de prueba (YourTestTarget -> Configuración de compilación -> buscar product module) no puede ser el mismo nombre que el nombre del proyecto.

El nombre del módulo del producto para el objetivo de prueba no puede ser el mismo nombre que el nombre de su proyecto

Una vez que cambié el nombre del módulo del producto para mi objetivo de prueba, todo funcionó.

ingrese la descripción de la imagen aquí

Bryan Norden
fuente
1

Mi solución está aquí

Primero haga clic en OdeAlSwiftUITest.swift, luego marque Project TargetName en la membresía de destino.

ingrese la descripción de la imagen aquí

eyup
fuente
77
Esto está mal. Nunca agregue sus archivos de prueba a su objetivo.
smileBot
1

ingrese la descripción de la imagen aquí

Haga clic en MyAppTests.swift en el navegador del proyecto, y haga clic en el panel derecho, verifique su módulo en Membresía de destino. Funciona en el mio.

Firda Sahidi
fuente
1

Intenté todas las respuestas aquí, pero la bandera roja no desapareció. Pero lo hice funcionar simplemente "ejecutando" una prueba vacía independientemente y se aclaró.

Cosas que me gustaría asegurarme de que se hagan:

  • Aplicación de host
  • @testable import "Module_name" (asegúrese de que el nombre del módulo sea correcto)
  • Asegúrese de que el objetivo de implementación para la prueba sea el mismo que el proyecto
  • XCTest no necesita ser miembro de Target
Alejandro
fuente
0

Para mí, la solución fue cambiar el nombre de @testable import myproject_ios a @testable import myproject después de haber actualizado el nombre del producto de destino myproject-ios en Build Settings / Packaging / Product Name / de $ {TARGET_NAME} a myproject.

Matías
fuente
0

Esto se solucionó cuando cambié el Objetivo de implementación de 9.3 a 11.0.

General> Objetivo de implementación> "11.0"

jacob_g
fuente
este podría ser más el caso de cambiar los simuladores, pero esto también funcionó para mí
RolandasR
0

Si está utilizando xcodebuild y encuentra este problema, considere agregar un indicador de área de trabajo al comando de compilación.

Cambiado esto

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

A esto

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test
Victor 'Chris' Cabral
fuente
0

En el objetivo de prueba de configuración de compilación, verifique la prueba de host, toma el nombre establecido en PRODUCT_NAME. Es ese nombre el que debes usar en las clases de prueba.

Recomiendo no cambiar PRODUCT_NAME (nombre del objetivo principal)

Sam
fuente
-1

Como se describe en esta respuesta , estaba agregando pruebas Swift a un proyecto solo Obj-C. La solución fue agregar una clase Swift ficticia, después de lo cual Xcode solicitaría agregar un encabezado de puente y luego eliminar la clase Swift. Todo estuvo bien después de eso.

funkybro
fuente
-1

Además de las otras cosas enumeradas, tuve que agregar el archivo con la clase que estaba tratando de probar a mis fuentes de compilación para el módulo de prueba unitariaingrese la descripción de la imagen aquí

Matt D
fuente
-1

Creo que esto puede haber sucedido porque eliminé las pruebas de ejemplo.

Quité el paquete de prueba de la Unidad y luego lo volví a agregar como se muestra en las imágenes a continuación y todo volvió a estar bien.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Declan McKenna
fuente