假设我正在为视图控制器上的tableView:cellForRowAtIndexPath:
委托方法编写单元测试。根据我传入的索引路径,此方法可以返回几个不同的单元格配置。
我可以在cell.textLabel.text
属性上轻松断言。但是,如何声明cell.imageView.image
属性包含正确的图像?图像或imageView都没有(公共API)属性,我可以使用它来查找图像名称或文件名。
我提出的最好的是创建smallest possible valid .png(使用[UIImage imageWithData:]
,所以我不在单元测试中触摸磁盘)并断言我从{{1获得的字节数组是我期待的那个。我创建了一个OCHamcrest matcher来使这个更好一点,但这是一种令人不满意且不灵活的方法。
有没有人有更好的主意?
答案 0 :(得分:3)
如果您使用的是[UIImage imagedNamed:]
,则会缓存图像。摘录自imagedNamed:
的{{3}}:
此方法在系统缓存中查找具有指定名称的图像对象,并返回该对象(如果存在)。如果匹配的图像对象尚未在缓存中,则此方法从指定的文件加载图像数据,对其进行缓存,然后返回结果对象。
这意味着您可以在cell.imageView.image == [UIImage imagedName:@"my_image"]
上断言,因为这是一个指针比较,并且由于图像被缓存,对具有相同名称的imageNamed:
的多次调用将返回相同的指针。即使内存变得紧张,你仍应该没问题,因为UIImage类引用解释了:
在内存不足的情况下,可以从UIImage对象中清除图像数据以释放系统上的内存。此清除行为仅影响UIImage对象内部存储的图像数据,而不影响对象本身。
答案 1 :(得分:0)
您可以使用UIImage
上的isEqual
方法直接比较UIImage
的内容,这将比较两个图像的情况。
所以在你的测试中,你可以这样做:
let expectedImage = UIImage(named: "my_picture")
let returnedImage = SomeImageReturnedFromFunction()
XCTAssertEqualObjects(expectedImage, returnedImage) // will return tree if SomeImageReturnedFromFunction returns my_picture
参考:https://developer.apple.com/documentation/uikit/uiimage#overview
答案 2 :(得分:0)
您确实可以与“ isEqual”方法进行比较,但是像这样:
False
答案 3 :(得分:0)
将图像转换为数据,然后比较数据。由于图像只是一个指向内存位置的指针。
guard let data1 = image1?.pngData(), let data2 = image2.pngData() else {
XCTFail("Data should not be nil")
return
}
XCTAssertEqual(data1, data2)
swift5