我正在为Swift应用程序编写测试。在此期间我需要测试处理图像。我想添加一个示例图像进行测试。根据我的理解,这似乎是错误的,我应该能够将图像直接拖到Xcode的ProductNameTests目录中。这会将图像添加到测试目标中。然后我尝试获取图像的路径:
let imagePath = NSBundle.mainBundle().pathForResource("example_image", ofType: "jpg")
不幸的是,这总是让nil
回归。我究竟做错了什么?谢谢!
您的问题是,您在主包中搜索图像。所以,目前您访问的图像不存在的mainBundle
,因为它在测试包中。
所以你需要访问另一个包。嵌套测试类的包。
为此,使用bundleForClass
而不是mainBundle
:
//The Bundle for your current class
var bundle = NSBundle(forClass: self.dynamicType)
var path = bundle.pathForResource("example_image", ofType: "jpg")
如您所见,为您的课程加载NSBundle
,您现在应该可以访问该图像。您还可以将图像添加到主目标并再次使用mainBundle
。
在Swift 3中,我使用此方法在测试中加载图像:
func loadImage(named name: String, type:String = "png") throws -> UIImage {
let bundle = Bundle(for:type(of:self))
guard let path = bundle.path(forResource: name, ofType: type) else {
throw NSError(domain: "loadImage", code: 1, userInfo: nil)
}
guard let image = UIImage(contentsOfFile: path) else {
throw NSError(domain: "loadImage", code: 2, userInfo: nil)
}
return image
}
然后我在测试中使用:
let image = try loadImage(named:"test_image", type: "jpg")
在Swift 4中你可以这样做
let testImage = UIImage(named: <#Image Name String#>, in: Bundle(for:<#Class Name#>.self), compatibleWith: nil)
这是我的xcassests中的图像,这是我的测试目标和主要目标的一部分
我在我的setUp()
函数中使用它来传递给我需要测试的图像处理类