Ресурсы приложения недоступны при тестировании пользовательского интерфейса в Xcode 7

Я пытаюсь расширить новые функции тестирования пользовательского интерфейса в Xcode 7, делая снимки текущих элементов экрана (метки, изображения, кнопки) и сохраняя информацию об их доступности в файлах json.

Идея состоит в том, что при последующем запуске тестов пользовательского интерфейса можно сделать текущий снимок экрана и сравнить с существующим, тест завершится неудачно, если будут обнаружены дополнительные или отсутствующие элементы.

К сожалению, ресурсы приложения недоступны во время тестирования пользовательского интерфейса, даже с правильной целью, поэтому файлы json не могут быть загружены для сравнения. Следующий стандартный код не может загрузить ресурс:

guard let resourcePath = NSBundle.mainBundle ().pathForResource ("StartScreenShapshot", ofType:"json") else {
        XCTFail ("can't load resource StartScreenShapshot")
        return
    }

Я могу понять, почему Apple выбрала этот подход с песочницей, поскольку тестирование пользовательского интерфейса должно основываться на том, что происходит на экране, и доступ к работе приложения не нужен, но отсутствие доступа к пакету ресурсов — это боль.

Итак, есть ли способ загрузить локальные ресурсы из приложения или каким-либо другим способом локально во время тестирования пользовательского интерфейса Xcode 7?

Сохранение файлов локально (автоматически) также было бы огромным плюсом, избавило бы от создания их вручную.


person danfordham    schedule 11.09.2015    source источник
comment
кажется, вы столкнулись со старой проблемой с тестами и пакетами, если да, посмотрите на этот вопрос stackoverflow.com/a/19636417/1403732   -  person sage444    schedule 11.09.2015
comment
Спасибо, чувак, это была проблема. Опубликовал ответ, ура.   -  person danfordham    schedule 11.09.2015


Ответы (2)


Спасибо @sage444

Для модульного тестирования метод mainBundle() не работает для получения пути к ресурсу, а использование класса работает.

 guard let resourcePath = NSBundle (forClass: self.dynamicType).pathForResource (contentName, ofType:"json") else {
        XCTFail ("can't load resource \(contentName)")
        return
    }
person danfordham    schedule 11.09.2015

Спасибо @danfordham

Обновлено для Swift 3

1) Скопируйте ресурсы пакета введите здесь описание изображения

2) Ссылка на новый пакет таким образом,

guard let path = Bundle(for: type(of: self)).path(forResource: contentName, ofType: "json") else {
    XCTFail ("can't load resource \(contentName)")
    return
}
person anders    schedule 10.05.2017