ios - quedan - explorador de archivos ipad
NSURL a la ruta del archivo en paquete de prueba con XCTest (6)
- Puede hacer referencia a los archivos del paquete como en cualquier destino.
- Verifique si el archivo está copiado en la fase de compilación Copy Bundle Resources (de su objetivo de prueba)
Para acceder al archivo local:
NSURL*imageUrl=[[NSBundle mainBundle]URLForResource:@"imageName" withExtension:@"png"];
Puede realizar un acceso asincrónico y esperar la respuesta utilizando: https://github.com/travisjeffery/TRVSMonitor
Si ha agregado: dataset1.json
en el objetivo de prueba (2):
NSString *p=[[NSBundle mainBundle] pathForResource:@"dataset1" ofType:@"json"];
NSLog(@"%@",p);
2013-10-29 15: 49: 30.547 PlayerSample [13771: 70b] WT (0): / Users / bpds / Library / Application Support / iPhone Simulator / 7.0 / Applications / 7F78780B-684A-40E0-AA35-A3B5D8AA9DBD / PlayerSample. app.app/dataset1.json
Intento escribir una aplicación iOS usando TDD y el nuevo framework XCTest. Uno de mis métodos recupera un archivo de Internet (dado un objeto NSURL) y lo almacena en los documentos del usuario. La firma del método es similar a:
- (void) fetchAndStoreImage:(NSURL *)imageUrl
Estoy intentando escribir la prueba para este método de una manera que no falle si no hay conexión a internet. Mi enfoque (tomado de una question anterior) es llamar al método usando un NSURL a una imagen en el sistema de archivos local.
Cuando se crea un nuevo proyecto con pruebas de unidades habilitadas, el directorio de Pruebas tiene un subdirectorio llamado ''Archivos de Soporte''. Supongo que ahí es donde deberían ir mis imágenes de prueba. Mi pregunta es cómo puedo obtener un objeto NSURL que apunta a una imagen en este directorio, ya que no me gustaría que las imágenes de prueba se incluyan en la aplicación. Cualquier ayuda es apreciada.
Aquí está la versión Swift de esto, Xcode 7, iOS 9, etc.
let testBundle = NSBundle(forClass: self.dynamicType)
let path = testBundle.pathForResource("someImage", ofType: "jpg")
XCTAssertNotNil(path)
Nota: someImage.jpg debe estar incluido en su objetivo de prueba.
De hecho, el [NSBundle mainBundle]
cuando se ejecuta un UnitTest no es la ruta de acceso de su aplicación, pero es / Developer / usr / bin, por lo que esto no funcionará.
La forma de obtener recursos en una prueba unitaria está aquí: OCUnit & NSBundle
En resumen, use:
[[NSBundle bundleForClass:[self class]] resourcePath]
o en tu caso:
[[NSBundle bundleForClass:[self class]] resourceURL]
El problema al que me enfrentaba era que el código de la aplicación intentaba acceder al paquete principal para cosas como bundleIdentifier y, dado que el paquete principal no era mi proyecto de prueba unitario, devolvía nada.
Un truco en torno a esto que funciona tanto en Swift 3.0.1 como en Objective-C es crear una categoría Objective-C en NSBundle e incluirla en su proyecto de prueba de unidad. No necesita un encabezado de puente ni nada. Esta categoría se cargará y ahora, cuando el código de la aplicación solicite el paquete principal, su categoría devolverá el paquete de prueba de la unidad.
@interface NSBundle (MainBundle)
+(NSBundle *)mainBundle;
@end
@implementation NSBundle (Main)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
+(NSBundle *)mainBundle
{
return [NSBundle bundleForClass:[SomeUnitTest class]];
}
#pragma clang diagnostic pop
@end
Solo para agregar a la respuesta correcta, este es un ejemplo de cómo obtener filePath para un archivo en sus UnitTests / Supporting Files:
NSString *filePath = [[[NSBundle bundleForClass:[self class]] resourcePath] stringByAppendingPathComponent:@"YourFileName.json"];
XCTAssertNotNil(filePath);
Esto probablemente sea útil para alguien.
Swift 2:
let testBundle = NSBundle(forClass: self.dynamicType)
let fileURL = testBundle.URLForResource("imageName", withExtension: "png")
XCTAssertNotNil(fileURL)
Swift 3, 4:
let testBundle = Bundle(for: type(of: self))
let fileURL = testBundle.url(forResource: "imageName", withExtension: "png")
XCTAssertNotNil(filePath)
Bundle proporciona formas de descubrir las rutas principales y de prueba para su configuración:
@testable import Example
class ExampleTests: XCTestCase {
func testExample() {
let bundleMain = Bundle.main
let bundleDoingTest = Bundle(for: type(of: self ))
let bundleBeingTested = Bundle(identifier: "com.example.Example")!
print("bundleMain.bundlePath : /(bundleMain.bundlePath)")
// …/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Agents
print("bundleDoingTest.bundlePath : /(bundleDoingTest.bundlePath)")
// …/PATH/TO/Debug/ExampleTests.xctest
print("bundleBeingTested.bundlePath : /(bundleBeingTested.bundlePath)")
// …/PATH/TO/Debug/Example.app
print("bundleMain = " + bundleMain.description) // Xcode Test Agent
print("bundleDoingTest = " + bundleDoingTest.description) // Test Case Bundle
print("bundleUnderTest = " + bundleBeingTested.description) // App Bundle
La URL Xcode 6 | 7 | 8 estará en Developer/Xcode/DerivedData
algo así como ...
file:///Users/
UserName/
Library/
Developer/
Xcode/
DerivedData/
App-qwertyuiop.../
Build/
Products/
Debug-iphonesimulator/
AppTests.xctest/
imageName.png
... que está separado de Developer/CoreSimulator/Devices
URL
file:///Users/
UserName/
Library/
Developer/
CoreSimulator/
Devices/
_UUID_/
data/
Containers/
Bundle/
Application/
_UUID_/
App.app/
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 Membresía objetivo solo en el paquete de prueba. El código de la aplicación solo debe tener Membresía objetivo en el paquete de la aplicación. En tiempo de ejecución, el paquete de destino de la prueba unitaria se inyecta en el paquete de aplicaciones para su ejecución .
Swift Package Manager (SPM) 4:
let testBundle = Bundle(for: type(of: self))
print("testBundle.bundlePath = /(testBundle.bundlePath) ")
Nota: De manera predeterminada, la swift test
línea de comando creará un paquete de prueba MyProjectPackageTests.xctest
. Y, el swift package generate-xcodeproj
creará un paquete de prueba MyProjectTests.xctest
. Estos diferentes paquetes de prueba tienen diferentes caminos . Además, los diferentes paquetes de prueba pueden tener algunas diferencias internas de estructura de directorios y contenido .
En cualquier caso, .bundlePath
y .bundleURL
devolverán la ruta del paquete de prueba que se está ejecutando actualmente en macOS. Sin embargo, Bundle
no está implementado actualmente para Ubuntu.
Además, la swift build
línea de comando y la swift test
no proporcionan actualmente un mecanismo para copiar recursos.
Sin embargo, con cierto esfuerzo, es posible configurar procesos para usar Swift Package Manger con recursos en macOS Xcode, línea de comandos macOS y entornos de línea de comandos de Ubuntu. Un ejemplo se puede encontrar aquí: 004.4''2 SW Dev Swift Package Manager (SPM) con recursos Qref
Swift Package Manager (SPM) 4.2
Swift Package Manager PackageDescription 4.2 introduce soporte de dependencias locales .
Las dependencias locales son paquetes en disco que se pueden derivar directamente utilizando sus rutas. Las dependencias locales solo están permitidas en el paquete raíz y anulan todas las dependencias con el mismo nombre en el gráfico del paquete.
Nota: Espero, pero aún no lo he probado, que algo similar a lo siguiente sea posible con SPM 4.2:
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "MyPackageTestResources",
dependencies: [
.package(path: "../test-resources"),
],
targets: [
// ...
.testTarget(
name: "MyPackageTests",
dependencies: ["MyPackage", "MyPackageTestResources"]
),
]
)