Algunos códigos que estoy probando en unidades necesitan cargar un archivo de recursos. Contiene la siguiente línea:
NSString *path = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"txt"];
En la aplicación funciona bien, pero cuando lo ejecuta el marco de prueba de la unidad pathForResource:
devuelve nulo, lo que significa que no se pudo localizar foo.txt
.
Me he asegurado de que foo.txt
esté incluido en la fase de compilación Copiar recursos de paquete del objetivo de prueba de unidad, entonces, ¿por qué no puede encontrar el archivo?
self
refiere a una clase en el paquete principal, no a la clase de caso de prueba. Reemplace[self class]
con cualquier clase en su paquete principal. Editaré mi ejemplo.bundleForClass:
con una clase en el paquete de prueba unitaria. Debería obtener la ruta del archivo en el código de prueba de su unidad, luego pasar la cadena de ruta a su otro código.Una implementación rápida:
Swift 2
Swift 3, Swift 4
Bundle proporciona formas de descubrir las rutas principales y de prueba para su configuración:
En Xcode 6 | 7 | 8 | 9, una ruta de paquete de prueba unitaria estará en
Developer/Xcode/DerivedData
algo así como ...... que es independiente de la
Developer/CoreSimulator/Devices
ruta del paquete normal (sin prueba unitaria) :También tenga en cuenta que el ejecutable de la prueba unitaria está, por defecto, vinculado con el código de la aplicación. Sin embargo, el código de prueba de la unidad solo debe tener la Membresía de destino solo en el paquete de prueba. El código de la aplicación solo debe tener Membresía de destino en el paquete de la aplicación. En tiempo de ejecución, el paquete de destino de prueba de unidad se inyecta en el paquete de aplicación para su ejecución .
Swift Package Manager (SPM) 4:
Nota: Por defecto, la línea de comando
swift test
creará unMyProjectPackageTests.xctest
paquete de prueba. Y,swift package generate-xcodeproj
creará unMyProjectTests.xctest
paquete de prueba. Estos diferentes paquetes de prueba tienen diferentes caminos . Además, los diferentes paquetes de prueba pueden tener alguna estructura interna de directorio y diferencias de contenido .En cualquier caso,
.bundlePath
y.bundleURL
devolverá la ruta del paquete de prueba que se está ejecutando actualmente en macOS. Sin embargo,Bundle
actualmente no está implementado para Ubuntu Linux.Además, la línea de comandos
swift build
yswift test
actualmente no proporcionan un mecanismo para copiar recursos.Sin embargo, con un poco de esfuerzo, es posible configurar procesos para usar Swift Package Manager con recursos en macOS Xcode, macOS línea de comandos y Ubuntu en línea de comandos. Un ejemplo se puede encontrar aquí: 004.4'2 SW Dev Swift Package Manager (SPM) con recursos Qref
Ver también: Usar recursos en pruebas unitarias con Swift Package Manager
Swift Package Manager (SPM) 4.2
Swift Package Manager PackageDescription 4.2 introduce soporte de dependencias locales .
Nota: Espero, pero aún no he probado, que algo como lo siguiente sea posible con SPM 4.2:
fuente
Con Swift Swift 3 la sintaxis
self.dynamicType
ha quedado en desuso, use esto en su lugaro
fuente
Confirme que el recurso se agrega al objetivo de prueba.
fuente
Si tiene un objetivo múltiple en su proyecto, entonces necesita agregar recursos entre diferentes objetivos disponibles en la Membresía de Target y puede necesitar cambiar entre diferentes Target como 3 pasos que se muestran en la figura a continuación
fuente
Tenía que asegurarme de que esta casilla de verificación Pruebas generales estuviera establecida
fuente