Подтвердить что ты не робот

Почему создание экземпляра UIFont в iphone unit test приводит к сбою?

Я пытаюсь использовать unit test код iphone, который создает шрифты. Я сузил его до следующего сбоя unit test:

#import "test.h"
#import <UIKit/UIKit.h>


@implementation test

- (void)testFonts {
  [UIFont systemFontOfSize:12];
}

@end

Это сбой с ошибкой:

Test Case '-[test testFonts]' started.
/Developer/Tools/RunPlatformUnitTests.include: line 415: 79768 Trace/BPT trap          "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}"
/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.sdk/Developer/usr/bin/otest' exited abnormally with code 133 (it may have crashed).

Кажется, есть какая-то настройка, которую я не делаю в моей целевой программе unit test, чтобы сделать эту работу. Как вы unit test создаете экземпляры шрифтов?

4b9b3361

Ответ 1

Один из моих друзей недавно столкнулся с этим, и я выкопал последний проект, который я успешно установил. Хитрость заключается в том, чтобы запускать любые ваши тесты, которые включают UIFont в тестах приложений, а не модульные тесты. Вот несколько советов по настройке целевой тестовой программы:

  • СТРОИТЕЛЬНЫЕ ФАЗЫ: Приведите свой производственный код в свой тестовый объект включая вашу главную цель, как одну из ваших тестовых целей зависимостей, а не включая файлы .m в вашем тесте цель. Это просто для организации.
  • СТРОИТЕЛЬНЫЕ НАСТРОЙКИ: убедитесь, что установлен тестовый объект "Bundle Loader" до $(BUILT_PRODUCTS_DIR)/Your Product Name.app/Your Product Name Again. Обратите внимание: это .../Product.app/Product - то есть не является .app в конечном сегменте пути. Если вам интересно см. файл, на который вы ссылаетесь, найти свой продукт сборки, правильно нажмите "Просмотреть содержимое пакета", затем найдите исполняемый файл.
  • СТРОИТЕЛЬНЫЕ НАСТРОЙКИ: Ваша тестовая цель "Test Host" должна быть установлена ​​на $(BUNDLE_LOADER). Легкий peasy.
  • СТРОИТЕЛЬНЫЕ НАСТРОЙКИ: контрольная цель. Другие флаги компоновщика должны включать -framework SenTestingKit.
  • СТРОИТЕЛЬНЫЕ НАСТРОЙКИ: "Тест после сборки" должен быть "Нет".
  • SCHEME: "Build" должен включать как вашу тестовую цель, так и вашу основную target, при этом "test" - только поле, выбранное в обеих целях.
  • СХЕМА: "Тест" должен включать только тестовую цель. Файлы включает в себя автоматически добавляется в список.

... надеюсь, этого будет достаточно, чтобы вы все пошли. Это не все чисто документировано в одном месте, и выяснение того, как получить оба типа тестов, требует больше времени и боли, чем я хотел бы признать.

Странно, что Apple, похоже, сняла свою собственную документацию по этому вопросу. Интересно, произойдет ли еще одно изменение...

Пожалуйста, ударьте меня, если у вас есть какие-либо дополнения к вышеперечисленному. Это не полное руководство по настройке тестирования приложений, но выше приведены недокументированные блоки преткновения, с которыми я столкнулся. FMI, я настоятельно рекомендую эту статью CocoaWithLove.

Ответ 2

В нем не сказано об этом очень хорошо, но Apple Testing Kit разбивает модульные тесты на две отдельные категории:

  • Логические тесты

    Эти тесты проверяют правильность функциональность вашего кода в чистое помещение.

  • Тесты приложений

    Эти тесты проверяют функциональность вашего кода в запуске приложение.

Кажется, что существует много кода, связанного с пользовательским интерфейсом, который не может быть запущен в случае с "Логическим тестом". Более подробную информацию о Logic Tests vs Application Tests можно найти здесь.

http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/UnitTesting/01-Unit-Test_Overview/overview.html

Ответ 3

Я вижу эту точную проблему с 3.2 (и 3.1.3). Я видел это на двух отдельных машинах, поэтому я не думаю, что мой SDK сломан.

Я создал новый проект на основе iPhone и добавил unit test и один тестовый пример.

Это настраивается как логический тест.

Выход консоли выглядит следующим образом:

Test Case '-[TestTests testTests]' started.
/Developer/Tools/RunPlatformUnitTests.include: line 415: 21141 Trace/BPT trap               "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}"
/Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig  '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Deve loper/usr/bin/otest' exited abnormally with code 133 (it may have crashed).
Command /bin/sh failed with exit code 1

Если я настроил unit test для отладки, тогда я могу увидеть сбой со следующим стеклом:

#0  0x00342d51 in __HALT 
#1  0x002947c7 in _CFRuntimeCreateInstance
#2  0x00b8441e in GSFontCreateWithName
#3  0x028c8f31 in +[UIFont systemFontOfSize:]

Я вижу точку Кендалла (материал UIKit может работать только на устройстве), но это, похоже, не очень хорошо документировано.

Ответ 4

Вы пробовали его на устройстве? Кажется, я помню, что вы можете включать только объекты UIKit в тесты при работе на устройстве, а не против симулятора...

Ответ 5

Извините за его выкапывание, но у меня есть проблема с тестом XCT на Xcode 5 и связана с этим потоком

Цитата:

"Многие классы UIKit не будут работать без UIApplication Попытка добавить код для прохождения тестов в этом проекте показала, что другие тесты также должны быть условно исключены из LogicTests:

Метод loadView по умолчанию не будет работать, поэтому метод testLoadView будет # ifdef'd.

Любая попытка присвоения/инициализации UILabel завершится с ошибкой. Я не знаю, почему, но из-за этого все тесты на ярлыках должны быть # ifdef'd.

Как правило, ничего не ожидайте от рамок UIKit для работы в тестах Logic. Другие структуры почти всегда будут работать (в этом приложении рамки CoreLocation и Foundation работают без проблем).

Внутри UIKit некоторые элементы будут работать - например, у UIWebView не было никаких проблем при тестировании. Точно, какие объекты пользовательского интерфейса терпят неудачу в пакете LogicTests (без реального запускающего приложения), никогда не становится ясным до тех пор, пока вы не попытаетесь, но эти сбои объясняются тем, почему вам все равно нужно запускать тесты приложений для проверки - тесты приложений являются более авторитетными результат для чего-нибудь в UIKit. "

URL: http://www.cocoawithlove.com/2009/12/sample-iphone-application-with-complete.html

Ответ 6

Выберите цель Unit Test в разделе "Цели" из списка "Проекты/цели" и в разделе "Общие" выберите основное приложение "Хост" в качестве основного приложения, в котором есть шрифты.

Это решило проблему для меня.