2011-12-22 3 views
12

В настоящее время я пишу тест на манипулирование изображениями для iPad-приложения. У меня есть папка с ресурсами внутри моей тестовой цели с фотографией внутри, однако, когда я пытаюсь получить к ней доступ, используя [UIImage imageNamed: @ "photo1.jpg"], изображение не возвращается. Если я изменил имя файла на один в основной папке Ресурсы, изображение вернется.Доступ к UIImage внутри целевого объекта OCUnit

Есть ли способ получить доступ к папке «Ресурсы» внутри целевой тестовой единицы?

ответ

23

Найдено ответ на это, похоже, вы не можете использовать [UIImage imageNamed:], вы можете получить доступ изображения, как это:

NSBundle *bundle = [NSBundle bundleForClass:[self class]]; 
NSString *imagePath = [bundle pathForResource:@"photo1" ofType:@"jpg"]; 
UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; 
2

Вы можете использовать следующую категорию (но добавить его только тестовой цели!). Это сделает UIImage imageNamed: метод работы автоматически в тестовой цели:

.h файл

/** 
* UIImage imageNamed: method does not work in unit test 
* This category provides workaround that works just like imageNamed method from UIImage class. 
* Works only for png files. If you need other extension, use imageNamed:extension: method. 
* NOTE: Do not load this category or use methods defined in it in targets other than unit tests 
* as it will replace original imageNamed: method from UIImage class! 
*/ 
@interface UIImage (ImageNamedForTests) 

/** 
* Returns image with the specified name and extension. 
* @param imageName Name of the image file. Should not contain extension. 
* NOTE: You do not have to specify '@2x' in the filename for retina files - it is done automatically. 
* @param extension Extension for the image file. Should not contain dot. 
* @return UIImage instance or nil if the image with specified name and extension can not be found. 
*/ 
+ (UIImage *)imageNamed:(NSString *)imageName extension:(NSString *)extension; 


@end 

.m файл

#import "UIImage+ImageNamedForTests.h" 
#import <objc/runtime.h> 

@implementation UIImage (ImageNamedForTests) 

+ (void)load { 
    [self swizzleClassMethod]; 
} 

+ (void)swizzleClassMethod { 
    SEL originalSelector = @selector(imageNamed:); 
    SEL newSelector = @selector(swizzled_imageNamed:); 
    Method origMethod = class_getClassMethod([UIImage class], originalSelector); 
    Method newMethod = class_getClassMethod([UIImage class], newSelector); 
    Class class = object_getClass([UIImage class]); 
    if (class_addMethod(class, originalSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) { 
     class_replaceMethod(class, newSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
    } else { 
     method_exchangeImplementations(origMethod, newMethod); 
    } 
} 

+ (UIImage *)swizzled_imageNamed:(NSString *)imageName { 
    return [self imageNamed:imageName extension:@"png"]; 
} 

+ (UIImage *)imageNamed:(NSString *)imageName extension:(NSString *)extension { 
    NSBundle *bundle = [NSBundle bundleForClass:[SomeClassFromUnitTestTarget class]];//Any class from test bundle can be used. NOTE: Do not use UIImage, as it is from different bundle 
    NSString *imagePath = [bundle pathForResource:imageName ofType:extension]; 
    return [UIImage imageWithContentsOfFile:imagePath]; 
} 
3

Сделано удобная категория для этого.

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

идет как:

@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 
11

С прошивкой 8 мы имеем: метод -imageNamed:inBundle:compatibleWithTraitCollection: на UIImage

В Swift:

let bundle = NSBundle(forClass: self.dynamicType) 
let image:UIImage? = UIImage(named: "imageFileName", 
          inBundle:bundle, 
    compatibleWithTraitCollection:nil) 

В Objective-C

NSBundle* bundle = [NSBundle bundleForClass:[self class]]; 
UIImage* image = [UIImage imageNamed:@"imageFileName.extension" 
          inBundle:bundle 
     compatibleWithTraitCollection:nil]; 
+0

Этот ответ должен быть наверху. Я создал новый инициализатор для UIImage, чтобы сделать то, что это уже делает. Сейчас я чувствую себя немой. https://gist.github.com/Psidium/6d15525d4fba7b191290 –

+0

Спасибо, это решило мою проблему. –