加载测试图像以进行单元测试

tru*_*umi 10 unit-testing objective-c

我正在为一个加载图像并进行一些颜色处理的类编写测试.图像加载

    UIImage* image = [UIImage imageNamed:imageName];
Run Code Online (Sandbox Code Playgroud)

如果我运行应用程序一切正常,图像按预期加载.我添加了一个单元测试,该测试应使用在测试期间加载的特定测试图像.如果我运行测试夹具,则不会加载图像.到目前为止我读到的是imageNamed方法总是从app bundle的资源文件夹加载.如何将其更改为我的测试包?

Mar*_*ijn 6

在Swift 3.0中你会做:

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

NameOfYourTestClass您的测试类✌️的名称在哪里


Ger*_*eri 5

为此做了一个方便的类别。

image = [UIImage testImageNamed:@"image.png"];
Run Code Online (Sandbox Code Playgroud)

像这样:

@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
Run Code Online (Sandbox Code Playgroud)


jus*_*tin 0

好吧,一种选择是将该资源添加到您的测试(应用程序)中。

就我个人而言,我只使用路径(initWithContentsOfFile:)、数据(initWithData:)等。这可能涉及引入一些参数 - 但这在许多情况下都很好,因为该参数可用于测试更多输入图像文件(如果您愿意),同时不会对应用程序进行太多更改/克隆/重新打包。