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.txtesté 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?

selfrefiere 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/DerivedDataalgo así como ...... que es independiente de la
Developer/CoreSimulator/Devicesruta 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 testcreará unMyProjectPackageTests.xctestpaquete de prueba. Y,swift package generate-xcodeprojcreará unMyProjectTests.xctestpaquete 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,
.bundlePathy.bundleURLdevolverá la ruta del paquete de prueba que se está ejecutando actualmente en macOS. Sin embargo,Bundleactualmente no está implementado para Ubuntu Linux.Además, la línea de comandos
swift buildyswift testactualmente 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.dynamicTypeha 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