Какой лучший способ заявить о UIImage в модульном тесте?
Скажем, я пишу юнит-тест для tableView:cellForRowAtIndexPath:
метод делегата на контроллере представления. Этот метод может вернуть пару различных конфигураций ячеек в зависимости от пути индекса, который я передаю.
Я могу легко утверждать на cell.textLabel.text
имущество. Но как я могу утверждать, что cell.imageView.image
свойство содержит правильное изображение? Ни у image, ни у imageView нет свойств (общедоступного API), которые я могу использовать, чтобы узнать имя изображения или имя файла.
Лучшее, что я придумал, это создание наименьшего возможного допустимого.png (используя [UIImage imageWithData:]
так что я не касаюсь диска в моих модульных тестах) и утверждая массив байтов, который я получаю cell.imageView.image
это тот, который я ожидаю. Я создал OCHamcrest matcher, чтобы сделать его немного лучше, но это неудовлетворительный и негибкий подход.
У кого-нибудь есть идея получше?
4 ответа
Если вы используете [UIImage imagedNamed:]
, the images are cached. Excerpt from the UIImage class reference for imagedNamed:
:
Этот метод ищет в системных кэшах объект изображения с указанным именем и возвращает этот объект, если он существует. Если соответствующий объект изображения еще не находится в кэше, этот метод загружает данные изображения из указанного файла, кэширует его и затем возвращает полученный объект.
This means you can assert on cell.imageView.image == [UIImage imagedName:@"my_image"]
as this is a pointer comparison and since the images are cached multiple calls to imageNamed:
with the same name will return the same pointer. Even if memory gets tight, you should still be fine, as the UIImage class reference explains:
В ситуациях с нехваткой памяти данные изображения могут быть удалены из объекта UIImage, чтобы освободить память в системе. Это очищающее поведение влияет только на данные изображения, хранящиеся внутри объекта UIImage, а не на сам объект.
Преобразование изображений в данные и последующее сравнение данных. Поскольку изображение является просто указателем на место в памяти.
guard let data1 = image1?.pngData(), let data2 = image2.pngData() else {
XCTFail("Data should not be nil")
return
}
XCTAssertEqual(data1, data2)
Свифт5
Вы можете сравнить содержание 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
Вы действительно можете сравнить с методом isEqual, но примерно так:
let expectedImage = UIImage(named: "an_image")
let returnedImage = myFunctionRet() // optional ?
XCTAssert(returnedImage?.isEqual(expectedImage) == true)