Estoy intentando configurar Unit Testing para mi proyecto. Es una aplicación Objective-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 compilar y ejecutar la aplicación sin problemas con Objective-C y código Swift.
Sin embargo, ahora quiero ejecutar algunas pruebas unitarias en la nueva clase Swift. Configuré mi archivo de prueba y se parece a lo siguiente:
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.
}
}
}
Recibo este error al ejecutar la aplicación como prueba:
'MyProject-Swift.h' file not found
No estoy seguro de por qué sucede esto solo cuando intento ejecutar las pruebas. ¿Alguna sugerencia?
ios
unit-testing
swift
header
JimmyJammed
fuente
fuente
Respuestas:
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 encabezado para mi objetivo de prueba unitaria.
Además, como @hyouuu señaló sobre ser el problema conocido, es de esperar que Apple proporcione una buena solución al final. Hasta que crea que tenemos que utilizar esta solución anterior.
https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html
fuente
<Product Name> Tests
a su objetivo de prueba. Sin embargo, esta solución no funciona si el nombre de su producto tiene espacios. Vea mi respuesta a continuación para obtener una solución.$(TARGET_TEMP_DIR)
no funcionó. Terminé usando$CONFIGURATION_TEMP_DIR/{myTargetName}.build/DerivedSources
Gracias a @gagarwal por resolver esto. En nuestro caso, el nombre del producto tiene un espacio, que está contraído
$PROJECT_NAME
, así que tuve que codificarlo. Además, al usar en$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:O, si su producto no contiene espacios:
fuente
Vi en la nota de lanzamiento de Xcode 6.1, que este es un problema conocido ... firmar ... Busque "-swift.h" en la nota de lanzamiento https://developer.apple.com/library/content/documentation/Xcode /Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html
¡Vea la solución alternativa de @gagarwal a continuación que FUNCIONA!
fuente
Creo que tuve un problema similar al tuyo; aquí estaba mi configuración.
Tenía un objeto definido en Swift:
Esta clase luego se usó en el inicializador de un objeto Objective-C:
Esto hizo que mis pruebas unitarias
Bar
no se compilaran, ya que elMyProject-Swift.h
encabezado no es real y el objetivo de la prueba unitaria no puede verlo. La nota de lanzamiento compartida por @hyouuu está en el punto, pero no estoy probando una clase Swift, ¡estoy probando una clase Objective-C!Pude solucionar esto cambiando el archivo de encabezado para
Bar
usar una referencia de clase directa en su lugar:A continuación, he incluido
MyProject-Swift.h
enBar.m
, y todo funcionaba - mis pruebas de Objective-C objetos escritos en Objective-C compilado correctamente y siguieron corriendo, y yo podría escribir nuevas pruebas para objetos Swift en Swift.¡Espero que esto ayude!
fuente
Foo
la API dentroBar.m
.MyProject-Swift.h
en el.m
archivo.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 file not found'.
Desapareció y mi aplicación funciona perfectamente bien. Supongo que debería haberlo considerado antes ... El error sigue apareciendo , pero después de ejecutar la aplicación siempre desaparece. Entonces el problema no está realmente resuelto para mí, pero puedo seguir trabajando en otros temas por ahora ...
fuente
Un simple
ha hecho el trabajo por mí.
fuente
Curiosamente, estaba viendo este mismo error, pero solo cuando apuntaba a un dispositivo (no al simulador). Antes de ejecutar la prueba, vería el signo de exclamación rojo junto a la declaración de importación para "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 a partir de entonces, XCode realmente genera el archivo "MyProjectNameTests-Swift.h", y la prueba funciona muy bien!
Entonces, al menos en mi caso, no hubo necesidad de las otras soluciones aquí, evidentemente, aunque creo que también funcionan.
También debo tener en cuenta que eliminé mi directorio DerivedData antes de esto, por lo que tal vez ese sea un paso que también valga la pena intentar.
fuente
mySwiftClassTests
(y cualquier otra clase rápida que desee utilizar en el objetivo-c) debe marcarse@objc
:fuente
No pude hacer que funcionara agregando esa ruta de archivo mencionada en otras respuestas, pero me di cuenta de que el archivo donde se quejaba ni siquiera se estaba probando. Solo tuve que eliminarlo del objetivo de prueba usando la barra lateral de utilidades derecha.
fuente
Agregar un archivo .swift a ese objetivo soluciona el problema.
fuente