iOS: el archivo ''MyProject-Swift.h'' no se encuentra cuando se ejecutan las pruebas unitarias de Swift
unit-testing header (9)
Agregar un archivo .swift a ese destino corrige el problema.
Estoy intentando configurar Unit Testing para mi proyecto. Es una aplicación Objetive-C existente, a la que recientemente agregué una clase Swift. He configurado los archivos ''MyProject-Swift.h'' y Swift Bridging (tanto ''MyProject'' como ''MyProjectTest'') y puedo construir y ejecutar la aplicación muy bien usando tanto el código Objective-C como Swift.
Sin embargo, ahora quiero ejecutar algunas pruebas unitarias en la nueva clase Swift. Configuré mi archivo de prueba y se ve así:
MySwiftClassTests.swift:
import UIKit
import XCTest
import MyProject
class MySwiftClassTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
XCTAssert(true, "Pass")
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measureBlock() {
// Put the code you want to measure the time of here.
}
}
}
Me aparece este error al ejecutar la aplicación como Prueba:
''MyProject-Swift.h'' file not found
No estoy seguro de por qué esto sucede solo cuando intento ejecutar las Pruebas. ¿Alguna sugerencia?
Creo que tuve un problema similar al suyo; aquí estaba mi configuración
Tenía un objeto definido en Swift:
// file Foo.swift
@objc public class Foo {
// ...
}
Esta clase se usó luego en el inicializador de un objeto Objective-C:
// file Bar.h
#import "MyProject-Swift.h"
@interface Bar: NSObject
- (instancetype)initWithFoo:(Foo *)foo;
@end
Esto hizo que las pruebas de mi unidad para Bar
no compilaran, ya que el encabezado MyProject-Swift.h
no es real y el objetivo de la prueba unitaria no puede verlo. La nota de lanzamiento compartida por @hyouuu está en punto, pero no estoy probando una clase Swift, ¡estoy probando una clase Objective-C!
Pude solucionar esto cambiando el archivo de encabezado de Bar
para utilizar una referencia de clase forward en su lugar:
// file Bar.h
@class Foo;
@interface Bar: NSObject
- (instancetype)initWithFoo:(Foo *)foo;
@end
Luego MyProject-Swift.h
en Bar.m
, y todo funcionó: mis pruebas de los objetos de Objective-C escritos en Objective-C se compilaron correctamente y continuaron ejecutándose, y pude escribir nuevas pruebas para objetos Swift en Swift.
¡Espero que esto ayude!
Después de probar todo lo que pude encontrar sobre el tema, lo que funcionó para mí fue ejecutar la aplicación, aunque todavía mostraba el error ''ModuleName-Swift.h archivo no encontrado''.
Se fue y mi aplicación funciona perfectamente bien. Supongo que debería haberlo considerado antes ... El error sigue volviendo , pero después de ejecutar la aplicación, siempre se va de nuevo. Entonces, el problema no está realmente resuelto para mí, pero puedo continuar trabajando en otros temas por ahora ...
Extrañamente, estaba viendo este mismo error, pero solo cuando selecciono un dispositivo (no el simulador). Antes de ejecutar la prueba, vería el signo de exclamación rojo junto a la declaración de importación de "MyProjectNameTests-Swift.h".
Sin embargo, lo curioso es que si sigo adelante y ejecuto la prueba de todos modos (a pesar de este aparente error de compilación), durante la fase de compilación que ocurre después, XCode realmente genera el archivo "MyProjectNameTests-Swift.h" y la prueba funciona bien!
Entonces, al menos en mi caso, no había necesidad de otras soluciones aquí, evidentemente, aunque creo que sí funcionan también.
También debería tener en cuenta que eliminé mi directorio DerivedData antes de esto, así que tal vez ese es un paso que también vale la pena probar.
Gracias a @gagarwal por resolver esto. En nuestro caso, el nombre del producto tiene un espacio, que está colapsado en $PROJECT_NAME
, así que tuve que codificarlo. Además, al usar $CONFIGURATION_TEMP_DIR
lugar de $TARGET_TEMP_DIR
, puede eliminar el directorio principal ( ../
) de la ruta. Entonces, la solución es agregar lo siguiente a las Rutas de búsqueda de encabezado en su objetivo de prueba:
"$(CONFIGURATION_TEMP_DIR)/Product Name With Spaces.build/DerivedSources"
O bien, si su producto no contiene espacios:
"$(CONFIGURATION_TEMP_DIR)/$(PROJECT_NAME).build/DerivedSources"
No pude hacer que funcionara al agregar esa ruta de archivo mencionada por otras respuestas, pero me di cuenta de que el archivo donde se quejaba ni siquiera se estaba probando. Solo tuve que quitarlo del objetivo de prueba utilizando la barra lateral de Right Utilities.
Vi en la nota de lanzamiento de Xcode 6.1 que este es un problema conocido ... firma ... Busca "-swift.h" en la nota de lanzamiento https://developer.apple.com/library/mac/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html
Las pruebas escritas en Objective-C no pueden importar el encabezado de interfaces generadas por Swift ($ (PRODUCT_MODULE_NAME) -Swift.h) para los objetivos de la aplicación y, por lo tanto, no se pueden usar para probar el código que requiere este encabezado.
Las pruebas para el código Swift deben escribirse en Swift. Las pruebas escritas en Objective-C para objetivos de marco pueden acceder a las interfaces generadas por Swift mediante la importación del módulo de marco utilizando @import FrameworkName ;. (16931027)
Por favor, vea la solución alternativa de @ gagarwal debajo de la cual FUNCIONA!
mySwiftClassTests
(y cualquier otra clase rápida que desee utilizar en @objc
-c) debe marcarse como @objc
:
@objc class MySwiftClassTests: XCTestCase
El archivo "MyProject-Swift.h" se genera en la siguiente ruta:
"$(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources"
Termino agregando esto a las Rutas de Búsqueda de Cabecera para mi objetivo de Prueba de Unidad.
También como @hyouuu señaló que era el problema conocido, con suerte Apple proporcionará una buena solución al final. Hasta que crea que necesitamos usar esta solución anterior.