xcode unit-testing nsbundle

Cargar archivos en pruebas de unidad xcode



unit-testing nsbundle (4)

Al ejecutar las pruebas, el paquete de la aplicación sigue siendo el paquete principal. Necesita usar paquete de pruebas unitarias.

C objetivo:

NSBundle *bundle = [NSBundle bundleForClass:[self class]]; NSString *path = [bundle pathForResource:@"TestData" ofType:@"xml"]; NSData *xmlData = [NSData dataWithContentsOfFile:path];

Swift 2:

let bundle = NSBundle(forClass: self.dynamicType) let path = bundle.pathForResource("TestData", ofType: "xml")! let xmlData = NSData(contentsOfFile: path)

Swift 3:

let bundle = Bundle(for: type(of: self)) let path = bundle.path(forResource: "TestData", ofType: "xml")! let xmlData = NSData(contentsOfFile: path)

Tengo un proyecto de prueba de la unidad Xcode 5 y algunos archivos xml de prueba relacionados. He intentado varios enfoques pero parece que no puedo cargar los archivos xml.

He intentado lo siguiente que no funciona

NSData* nsData = [NSData dataWithContentsOfFile:@"TestResource/TestData.xml"]; NSString* fileString = [NSString stringWithContentsOfFile:@"TestData.xml" encoding:NSUTF8StringEncoding error:&error];

Además, si trato de obtener una vista previa de todos los paquetes usando [NSBundle allBundles] ¿el paquete de prueba de unidad no aparece en la lista?

Traté de crear un paquete de recursos por separado y parece que no puedo localizarlo mediante programación, aunque se compila y se implementa.

Qué estoy haciendo mal ?


Como se indica en esta answer :

Cuando el arnés de prueba de la unidad ejecuta su código, el paquete de prueba de la unidad NO es el paquete principal. Aunque está ejecutando pruebas, no su aplicación, su paquete de aplicaciones sigue siendo el paquete principal.

Si usa el siguiente código, su código buscará en el paquete en el que se encuentra la clase de prueba de su unidad, y todo estará bien.

C objetivo:

NSBundle *bundle = [NSBundle bundleForClass:[self class]]; NSString *path = [bundle pathForResource:@"TestData" ofType:@"xml"]; NSData *xmlData = [NSData dataWithContentsOfFile:path];

Rápido:

let bundle = NSBundle(forClass: self.dynamicType) if let path = bundle.pathForResource("TestData", ofType: "xml") { let xmlData = NSData(contentsOfFile: path) }


Con swift Swift 3 la sintaxis self.dynamicType ha quedado en desuso, use esto en su lugar

let testBundle = Bundle(for: type(of: self)) guard let ressourceURL = testBundle.url(forResource: "TestData", ofType: "xml") else { // file does not exist return } do { let ressourceData = try Data(contentsOf: ressourceURL) } catch let error { // some error occurred when reading the file }

o

guard let ressourceURL = testBundle.url(forResource: "TestData", withExtension: "xml")


Las rutas relativas son relativas al directorio de trabajo actual. Por defecto, eso es / - el directorio raíz. Está buscando esa carpeta en el nivel raíz de su disco de inicio.

La forma correcta de obtener un recurso que está dentro de su paquete es pedirle a su paquete que lo haga.

En una aplicación, obtendría el paquete utilizando [NSBundle mainBundle] . No sé si eso funciona en un caso de prueba; pruébalo, y si no lo hace (si devuelve nil o un objeto bundle inútil), sustituye [NSBundle bundleForClass:[self class]] .

De cualquier manera, una vez que tenga el paquete, puede solicitar la ruta o la URL de un recurso. En general, debe buscar las URL a menos que tenga un motivo muy específico para necesitar una ruta (como pasarla a una herramienta de línea de comandos usando NSTask). Envíe al paquete un URLForResource:withExtension: mensaje para obtener la URL del recurso.

Luego, con el propósito de leer una cadena de este, use [NSString stringWithContentsOfURL:encoding:error:] , pasando la URL que recibió del paquete.