No se puede cargar el módulo subyacente para XCTest

180

Estoy trabajando rápidamente en Xcode y, de forma predeterminada, crea un archivo de prueba que hace referencia a XCTest.

Cuando configuro la membresía de destino para mi proyecto principal, causa este error

No se puede cargar el módulo subyacente para XCTest

Si no se establece esta membresía de destino, las pruebas se ejecutan correctamente y todo funciona bien.

PD: soy nuevo en Swift y probablemente sea una pregunta tonta (por favor, ilumíneme)

brduca
fuente
17
No hay preguntas tontas, saltamontes, solo preguntas tontas. ;-) Gran pregunta ya que todos los que lean esto tendrán el mismo problema.
Lance Kind

Respuestas:

168

El proyecto principal no se vincula con el marco XCUnit. Debe crear un objetivo de prueba separado para su proyecto, si aún no existe, y agregar sus archivos de origen de prueba a ese objetivo.

  1. Seleccione su proyecto en el Navegador de proyectos. Esto abrirá la configuración del proyecto en el editor.
  2. Haga clic en el botón "+" en la parte inferior de la columna que enumera sus objetivos.

ingrese la descripción de la imagen aquí

  1. Si está trabajando en una plantilla de proyecto de iOS , seleccione iOS > Test > iOS Unit Testing Bundle.

    Si está trabajando en una plantilla de proyecto OS X , seleccione OS X > Test > OS X Unit Testing Bundle.

pwc
fuente
3
Mientras tanto, para iOS se llama iOS UITesting Bundle (úsalo para las pruebas de IU) o iOS Unit Testing Bundle (es para Unit Tests ...)
kuzdu
184

Verifique que el archivo en cuestión no esté en el objetivo principal, sino solo en el objetivo de prueba. Solo el objetivo de prueba tendrá ese marco para importar.

Aaron Zinman
fuente
16
Si eso ayuda. Seleccione su objetivo 'No prueba' -> Fases de construcción -> Compilar fuentes. Asegúrese de que su "ClassTest.swift" no esté en el objetivo de compilación normal.
Nick N
Y si está en el paquete principal y en el paquete de prueba, ¿cómo lo elimina del paquete principal?
James Robinson
1
Gracias @NickN, usted señaló el problema exacto que tenía y eso ya está solucionado.
Naishta
SI está en el Objetivo de prueba, parece que no puedo acceder a ninguno de mis métodos de prueba principales en mi Objetivo principal.
UKDataGeek
gracias funcionó a las mil maravillas. solo eliminando los archivos de prueba funcionó.
Ccr
32

Acaba de agregar su archivo / clase de pruebas al objetivo principal y no al objetivo de la prueba por error. Simple como eso.

Solución:

1) Elimine el archivo de prueba de la lista "Compilar orígenes" en la pestaña "Fases de compilación" para el objetivo principal

2) Agregue el mismo archivo en "Compilar fuentes" en la pestaña "Fases de compilación" para el objetivo de prueba

Debe resolver el problema.

Alfishe
fuente
15

Recibo este error si creo un objetivo de marco dinámico de macOS, que se vincula a XCTest.framework(¡el objetivo es un objetivo de marco, no un objetivo de prueba!).

En este caso, el problema se resuelve agregando

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks

a "Configuración de compilación / Rutas de búsqueda de marco" del proyecto.

Stanislav Pankevich
fuente
¡Perfecto! ¡Gracias!
Lance Kind
9
Mejor: $(PLATFORM_DIR)/Developer/Library/Frameworksen caso de que tenga instaladas varias versiones de Xcode con diferentes nombres (por ejemplo, versiones de lanzamiento y beta).
rob mayoff
Gracias @robmayoff esta fue la solución correcta ;-)
Oliver Pearmain
Esta es la respuesta correcta al crear un marco para probar el soporte.
Daniel Wood
7

Después de un montón de solución de problemas y rebotando en las páginas de Stack Overflow como esta, pude encontrar un detalle que no se mencionó en las otras páginas de solución de problemas de iOS Unit Test.

Si su proyecto usa CocoaPods, asegúrese de incluir su objetivo de prueba anidado dentro del objetivo de su aplicación principal. Es posible que su archivo de pod no lo incluya si creó su objetivo de prueba después de ejecutarlo pod init. Su podfile debería verse así:

target 'YourApp' do
    target 'YourAppTests' do
        inherit! :search_paths
        # Pods for testing
    end
end

Recuerde guardar su archivo de pod y ejecutar pod installdespués de hacerlo.

¡Espero eso ayude!

Orlando G Rodriguez
fuente
5

Tal vez sea un poco tarde, pero lo que tienes que hacer es:

Haga clic en Archivo> Nuevo> Destino> Paquete de prueba de unidad iOS.

Y luego agregue sus pruebas allí. Esto funcionó para mí. El problema fue que no seleccioné crear pruebas unitarias cuando creé mi proyecto. Espero que esto ayude a alguien.

Clinton D'Souza
fuente
2

Este problema ocurre dos veces en su proyecto.

  1. Cuando no agrega UnitTestingBundle en su proyecto cuando crea un nuevo proyecto.
  2. Cuando instalas CocoaPods en tu proyecto en algún momento, no siempre.

1: respuesta:

  • Ir al archivo Haga clic en Archivo.

  • Luego verá Primera opción Nuevo Haga clic en ella.

  • Después de hacer clic en él, verá Algunas opciones Haga clic en Destino.

  • Y luego, en la barra de búsqueda, se resuelve el paquete de prueba de unidad de IOS y el problema Agregar.

  • si el compilador no puede darle permiso para agregar esto, intente con el segundo método cuando se indica a continuación.

2. Responda al problema de CocoaPod:

  • Ir al producto Haga clic en el producto.

  • Haga clic en limpiar o presione cmd + k.

  • El problema está resuelto.

Zeeshan Dar
fuente
2

Si bien la respuesta aceptada resuelve este problema la mayoría de las veces, hay una forma más de encontrar este error.

Si ya te has asegurado de que:

Como lo señalaron @pwc @ nick-ny otros

  1. El ClassTest.swiftarchivo para la membresía de destino asegurándose de que solo se adjunte al objetivo de prueba.
  2. No ClassTest.swiftse puede ver debajo del objetivo principal de la aplicación> Generar orígenes> Compilar orígenes

Esto es lo que más puede verificar:

en tu .podspecsarchivo

Asegúrese de que su source_filesno incluye directa o indirectamente el directorio de prueba.

por ejemplo :

s.source_files = ["Classes/**/*.{swift}", "Classes/**/*.{xib}"]
s.exclude_files = ["Classes/Exclude", "Classes/MyPodProjTests/"]

Tenga en cuenta que Classes/**/*.{swift}incluye todo lo que anula el hecho de que el directorio MyPodProjTestsdebe ser excluido.

Solución:

s.source_files = ["Classes/MyPodProj/**/*.{swift}", "Classes/**/*.{xib}"]

Nota: Este es un caso extremadamente extremo y un error completamente humano, pero pensé que valdría la pena señalarlo.

thesummersign
fuente
Excelente comentario, había incluido todo en mi s.source_files. ¡Gracias!
Mauricio Chirino
1

Asegúrese de que la Membresía de destino esté marcada para todos los módulos cuando se seleccione el marco de prueba. Puede ver la opción de Membresía de destino seleccionando Ver-> Utilidades-> Mostrar inspector de archivos

karma
fuente
1

En mi caso, estaba haciendo las pruebas para un pod privado, por lo que en el podspec era como:

s.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'Tests/*.swift' end

Pero en el Podfile olvidé traer la especificación de prueba, como tal:

target 'MyApp' do
use_frameworks!
pod 'CoconutLib', '~> 1.0', :testspecs => ['Tests'] end
Hugo Jordao
fuente
0

Hice todo lo anterior, pero aún no se me permitió acceder a los métodos que quería probar. Pero antes de escribir cualquier caso de prueba construí el proyecto una vez y luego los métodos fueron accesibles para probar. Así que pruébalo y avísame si resolvió algún problema.

sunil chayagol
fuente
0

Tuve el mismo problema y la solución para mí fue:

  1. Selecciona mi esquema
  2. Editar esquema ...
  3. Luego, cuando se abra la ventana de configuración del Esquema, seleccione la pestaña izquierda llamada "Prueba" para ser redirigido aquí: ingrese la descripción de la imagen aquí
  4. Como puede ver, mis UITests no se agregan aquí, pero existen en mi proyecto, así que solo tuve que tocar el botón más y seleccionar mi objetivo de UITests de esta manera: ingrese la descripción de la imagen aquí
  5. Luego toque el botón "Agregar" y cierre la vista de configuración
  6. Termine con un proyecto limpio e intente nuevamente, debería funcionar
  7. Y no olvide verificar eso también: https://developer.apple.com/library/archive/qa/qa1954/_index.html

Espero que esta respuesta ayude.

PD: un último pensamiento en mi objetivo de prueba en la configuración de compilación tuve que verificar estas propiedades que no se configuraron correctamente:

DEBUG_INFORMATION_FORMAT = dwarf; 
ONLY_ACTIVE_ARCH = YES;
VALIDATE_PRODUCT = NO;
O. Boujaouane
fuente
0

Justo como @Alfishe mencionó anteriormente:

Tienes que eliminar los archivos de prueba de Compiler SourcesdebajoBuild Phases

Como se muestra abajo


ingrese la descripción de la imagen aquí

Suhaib
fuente
1
Si lo haces, no puedes ejecutar las pruebas, que yo sepa
Juan Curti el
0

Verifique la membresía de destino de su clase de prueba.

Denis Kutlubaev
fuente