Использование изображения UIImageNamed внутри XCTestCase

Я не могу получить модульные тесты XCTestCase для Cocoa Touch Static Library, которые полагаются на код, который использует imageNamed для работы.

Я добавил свое изображение "plane.png" к целевой цели, но [UIImage imageNamed] продолжает возвращать нуль.
Когда я явно укажу путь к образцу в тесте и загружаю изображение из файла, он работает.

NSString* imagePath = [[[NSBundle bundleForClass:[self class]] resourcePath] stringByAppendingPathComponent:@"plane.png"];
UIImage* imageWorks = [UIImage imageWithContentsOfFile:imagePath];

UIImage* imageStaysNil = [UIImage imageNamed:@"plane.png"];

Как я могу написать модульные тесты для кода, который использует imageNamed?

Ответ 1

В XCTest вы не в mainBundle. Так что получите свое изображение из вашего пакета XCTest.

(это решение для iOS8+)

ObjC

[UIImage imageNamed:@"..." inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:nil];

стриж

UIImage(named: "...", in: Bundle(for: type(of: self)), compatibleWith: nil)

Ответ 2

Так как ваш xctest-проект действует как другой проект, обязательно добавить ваш файл .png для xctest.

добавьте изображение plane.png в xctest-проект. Убедитесь, что вы проверили как

enter image description here

Он отлично работает для меня с тем же кодом

enter image description here

Ответ 3

Принятый ответ не работал для меня; вот что сделал.

let image = UIImage(contentsOfFile: 
    Bundle(for: TheTestClass.self)
    .path(forResource: "plane", ofType: "jpg")!)!