6

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

我可以很容易地断言该cell.textLabel.text属性。但是我如何断言该cell.imageView.image属性包含正确的图像?图像或 imageView 都没有(公共 API)属性,我可以使用它来找出图像名称或文件名。

我想出的最好的方法是创建最小的有效 .png(使用[UIImage imageWithData:]这样我就不会在单元测试中接触磁盘)并断言我得到的字节数组cell.imageView.image是我期望的。我创建了一个OCHamcrest 匹配器来使它更好一点,但这是一种不令人满意且不灵活的方法。

有没有人有更好的主意?

4

4 回答 4

6

如果您使用[UIImage imagedNamed:],则图像将被缓存。摘自UIImage 类imagedNamed:参考:

此方法在系统缓存中查找具有指定名称的图像对象,如果存在则返回该对象。如果匹配的图像对象尚未在缓存中,则此方法从指定文件加载图像数据,缓存它,然后返回结果对象。

这意味着您可以断言,cell.imageView.image == [UIImage imagedName:@"my_image"]因为这是一个指针比较,并且由于图像被缓存,多次调用imageNamed:具有相同名称将返回相同的指针。即使内存变得紧张,你仍然应该没问题,正如 UIImage 类参考解释的那样:

在内存不足的情况下,可能会从 UIImage 对象中清除图像数据以释放系统上的内存。这种清除行为只影响 UIImage 对象内部存储的图像数据,而不影响对象本身。

于 2013-10-10T17:12:49.843 回答
1

您可以UIImage直接使用isEquala 上的方法比较两个图像的内容,该方法UIImage将比较两个图像的相似之处。

所以在你的测试中,你可以这样做:

let expectedImage = UIImage(named: "my_picture")
let returnedImage = SomeImageReturnedFromFunction()
XCTAssertEqualObjects(expectedImage, returnedImage) // will return true if SomeImageReturnedFromFunction returns my_picture

参考:https ://developer.apple.com/documentation/uikit/uiimage#overview

于 2018-06-03T06:02:40.630 回答
0

您确实可以与“isEqual”方法进行比较,但更像这样:

let expectedImage = UIImage(named: "an_image")
let returnedImage = myFunctionRet() // optional ?

XCTAssert(returnedImage?.isEqual(expectedImage) == true)
于 2020-11-09T15:14:13.097 回答
0

将图像转换为数据,然后比较数据。由于图像只是指向内存位置的指针。

guard let data1 = image1?.pngData(), let data2 = image2.pngData() else {
    XCTFail("Data should not be nil")
    return
}
XCTAssertEqual(data1, data2)

斯威夫特5

于 2021-01-13T14:53:25.460 回答