在单元测试中断言UIImage的最佳方法是什么?

时间:2013-10-10 15:16:09

标签: ios objective-c unit-testing ocmockito

假设我正在为视图控制器上的tableView:cellForRowAtIndexPath:委托方法编写单元测试。根据我传入的索引路径,此方法可以返回几个不同的单元格配置。

我可以在cell.textLabel.text属性上轻松断言。但是,如何声明cell.imageView.image属性包含正确的图像?图像或imageView都没有(公共API)属性,我可以使用它来查找图像名称或文件名。

我提出的最好的是创建smallest possible valid .png(使用[UIImage imageWithData:],所以我不在单元测试中触摸磁盘)并断言我从{{1获得的字节数组是我期待的那个。我创建了一个OCHamcrest matcher来使这个更好一点,但这是一种令人不满意且不灵活的方法。

有没有人有更好的主意?

4 个答案:

答案 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