2012-08-13 16 views
7

Ich schreibe einen Test für eine Klasse, die ein Bild lädt und einige Farbmanipulationen durchführt. Das Bild wird geladen mitLaden Sie ein Testbild für Unit-Test

UIImage* image = [UIImage imageNamed:imageName]; 

Wenn ich die App alles in Ordnung ist und die Bilder laufen wie erwartet geladen. Ich fügte einen Komponententest hinzu, der ein bestimmtes Testbild verwenden soll, das während des Tests geladen wird. Wenn ich das Testgerät starte, wird das Bild nicht geladen. Was ich bisher gelesen habe, ist, dass die Methode imageNamed immer aus dem Ressourcenordner des App-Bundles geladen wird. Wie kann ich dies zum Bündel meines Tests ändern?

Antwort

0

Nun, eine Möglichkeit wäre, diese Ressource zu Ihrem Test (App) hinzuzufügen.

persönlich verwende ich nur Pfade (initWithContentsOfFile:), Daten (initWithData:), und so. Dies kann beinhalten einige Parameter einzuführen - aber das ist gut in vielen Fällen, weil dieser Parameter verwendet werden kann, um mehr Input-Image-Dateien zu testen (wenn Sie möchten), während die Anwendungen nicht viel ändern/klonen/neu verpacken.

+0

das bedeutet aber, dass Sie den Seriencode für Testzwecke ändern, was nicht der Fall sein sollte, e speziell nicht für Rahmenteile, die gemacht werden, um Ihr Leben einfacher zu machen;). – trumi

+0

@truni also ... du versuchst mich davon zu überzeugen, dass du '[UIImage imageNamed:]' für die Teile deines Frameworks verwendest, und so sollte es sein? Die Verwendung von '[UIImagne imageNamed:]' in diesem Kontext ist aus mehreren Gründen eine wirklich schlechte Idee. Wenn Sie ein faux-ios-Framework schreiben, verwenden Sie NSBundle und geben Sie das Ressourcenverzeichnis Ihres faux-ios-framework an oder suchen Sie es. dann benutze etwas anderes als '[UIImage imageNamed:]'. Erstellen Sie dann ein weiteres Bundle für Ihre Testvariante und führen Sie Ihre Tests über alle Bundles durch. – justin

+0

und in diesem Kontext ändert es nicht den Code für Testzwecke, es würde Ihren Code ändern, weil Ihr Code das Falsche tat. Anstatt ein neues Bündel zu erstellen, können Sie diese Parameter an die Schnittstellen Ihres Frameworks (öffentlich oder privat) übergeben. – justin

2

Wenn Sie meinen, dass Sie ein Bild im Testpaket haben, das Sie nur in Tests verwenden möchten (z. B. eine Testvorrichtung), sehen Sie sich this answer an.

Sie können diese Antwort anpassen, um den NSBundle Ihrer aktuellen App mit [NSBundle bundleForClass:[SomeClassThatExistsInTheAppOnly class]] zu erhalten. Auf diese Weise können Sie das App-Bundle gezielt aus einem Testpaket auswählen.

4

Eine handliche Kategorie dafür gemacht.

image = [UIImage testImageNamed:@"image.png"]; 

geht so:

@interface BundleLocator : NSObject 
@end 

@interface UIImage (Test) 
+(UIImage*)testImageNamed:(NSString*) imageName; 
@end 

@implementation BundleLocator 
@end 

@implementation UIImage (Test) 
+(UIImage*)testImageNamed:(NSString*) imageName 
{ 
    NSBundle *bundle = [NSBundle bundleForClass:[BundleLocator class]]; 
    NSString *imagePath = [bundle pathForResource:imageName.stringByDeletingPathExtension ofType:imageName.pathExtension]; 
    return [UIImage imageWithContentsOfFile:imagePath]; 
} 
@end 
1

Sie auch diese (in Swift) verwenden:

let bundle = NSBundle(forClass: MyClass.self) 
let img = UIImage(named: "TestImage", inBundle: bundle, compatibleWithTraitCollection: nil) 
4

In Swift 3.0 Sie tun würden:

let bundle = Bundle.init(for: NameOfYourTestClass.self) 
let image = UIImage(named: "TestImage", in: bundle, compatibleWith: nil) 

Wo NameOfYourTestClass ist der Name Ihrer Testklasse ✌️

0

Um App-Bundle zu ändern:

let Bündel = Bundle (Kennung: "org.cocoapods.ACSPLib")

let Foto = UIImage (genannt: nameofThePhoto, in: bundle, compatibleWith: null)

die Bündelkennung

bundle identifier for pod