我正在爲加載圖像並進行一些顏色處理的類寫一個測試。 圖像加載加載單元測試的測試圖像
UIImage* image = [UIImage imageNamed:imageName];
如果我運行的應用程序,一切都很好,並如預期的圖像加載。我添加了一個單元測試,在測試過程中應該使用特定的測試圖像加載。如果我運行測試夾具,圖像不會被加載。目前我讀到的是,imageNamed方法總是從應用程序包的資源文件夾中加載。我怎樣才能將其改變爲我的測試包?
我正在爲加載圖像並進行一些顏色處理的類寫一個測試。 圖像加載加載單元測試的測試圖像
UIImage* image = [UIImage imageNamed:imageName];
如果我運行的應用程序,一切都很好,並如預期的圖像加載。我添加了一個單元測試,在測試過程中應該使用特定的測試圖像加載。如果我運行測試夾具,圖像不會被加載。目前我讀到的是,imageNamed方法總是從應用程序包的資源文件夾中加載。我怎樣才能將其改變爲我的測試包?
好,其中一個方案是向資源添加到您的測試(應用程序)。
親自,我只是使用路徑(initWithContentsOfFile:
),數據(initWithData:
)等。這可能涉及引入一些參數 - 但在很多情況下,這是好,因爲該參數可用於測試更多輸入圖像文件(如果您喜歡),而不會更改/克隆/重新打包應用程序。
如果你的意思是你有,你想使用只能在測試(即測試夾具)的測試包的形象,去看看this answer。
您可以根據這個問題的答案用[NSBundle bundleForClass:[SomeClassThatExistsInTheAppOnly class]]
得到實際應用的一個NSBundle。這使您可以專門定位測試包中的應用程序包。
這是一個方便的類別。
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
你也使用這個(斯威夫特):
let bundle = NSBundle(forClass: MyClass.self)
let img = UIImage(named: "TestImage", inBundle: bundle, compatibleWithTraitCollection: nil)
在雨燕3.0,你會怎麼做:
let bundle = Bundle.init(for: NameOfYourTestClass.self)
let image = UIImage(named: "TestImage", in: bundle, compatibleWith: nil)
凡NameOfYourTestClass
是你的測試班的名字✌️
要改變應用程序包:
設束=軟件包(標識符: 「org.cocoapods.ACSPLib」)
設相片= UIImage的(命名爲:nameofThePhoto,在:束,compatibleWith:無)
束標識符
但這意味着你改變用於測試目的的生產代碼,這不應該是這樣è特別不適用於使您的生活更輕鬆的框架部件;)。 – trumi 2012-08-14 19:42:59
@truni所以...你試圖說服我,你正在使用'[UIImage imageNamed:]'爲你的框架的部分,這就是它應該的方式?在這種情況下使用'[UIImage imageNamed:]'是一個非常糟糕的主意,原因有幾個。如果你正在編寫一個faux-ios框架,請使用NSBundle並指定或找到你的faux-ios框架的資源目錄。然後使用除[UIImage imageNamed:]'以外的內容。然後爲您的測試變體創建另一個包並運行所有包中的測試。 – justin 2012-08-14 20:08:47
,在這種情況下,它並不會改變測試代碼,它會改變你的代碼,因爲你的代碼做錯了事情。而不是一直創建新的包,您可以將這些參數傳遞給您的框架接口(公共或私有)。 – justin 2012-08-14 20:21:58