12

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

    UIImage* image = [UIImage imageNamed:imageName];

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

4

6 回答 6

12

在 Swift 3.0 中,你会这样做:

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

NameOfYourTestClass你的测试班的名字在哪里✌️

于 2017-01-27T09:32:32.137 回答
5

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

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
于 2014-05-06T23:45:27.467 回答
4

如果您的意思是您在测试包中有一个只想在测试中使用的图像(即测试夹具),请查看此答案

您可以通过使用来定制该答案以获取实际应用程序的 NSBundle [NSBundle bundleForClass:[SomeClassThatExistsInTheAppOnly class]]。这使您可以专门针对测试包中的应用包。

于 2013-06-24T01:39:20.177 回答
3

你也可以使用它(在 Swift 中):

let bundle = NSBundle(forClass: MyClass.self)
let img = UIImage(named: "TestImage", inBundle: bundle, compatibleWithTraitCollection: nil)
于 2016-04-25T15:38:56.750 回答
1

要更改应用程序包:

让 bundle = Bundle(标识符:“org.cocoapods.ACSPLib”)

let photo = UIImage(named: nameofThePhoto, in: bundle, compatibleWith: nil)

捆绑标识符

pod 的包标识符

于 2018-02-06T17:34:51.530 回答
0

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

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

于 2012-08-13T20:50:27.513 回答