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

Командная строка iPhone. Тесты модулей (и ввод/вывод файлов)

Короткий вопрос: Как я могу заставить файловые операции iPhone (objective-c) корректно работать из командной строки Unit Test?

Длинный вопрос с объяснением: В итоге это станет script, чтобы выполнить автоматическое построение/тестирование моей сборки iPhone через экземпляр Hudson. Следуя ссылке makdad на этом, вопрос SO позволил мне успешно выполнить тесты Unit из командной строки (полу).

Однако один из моих тестов терпит неудачу. Тест будет вызывать класс Caching Service для сохранения файла, а затем попытаться его восстановить. однако при попытке выполнить тесты из командной строки файл I/O не работает: (.

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

Я использую вызовы метода NSFileHandle для получения дескрипторов для записи. если они возвращают nil, файл создается с помощью

[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];

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

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

4b9b3361

Ответ 1

Сначала: 'симулятор должен быть запущен уже для того, чтобы это работало "
У меня есть тесты, выполняемые в терминале, и не имеет значения, включен ли симулятор.

Возможно, некоторые настройки сборки вы должны посмотреть: TEST_HOST и BUNDLE_LOADER. Я оставляю их пустыми на моем xcodeproj.
Примечание. Я также использую Hudson с отчетами об испытаниях и охватом кода.

Второе:
Я испытал сбои в терминалах тестирования и приложении с путями загрузки. Это было связано с моделью Core Data, загружаемой из ресурса.
Решением было загрузить файл из url вместо пути:

[[NSBundle bundleForClass:[self class]] URLForResource:....];

Я не могу гарантировать, что это связано с той же проблемой, с которой вы сталкиваетесь с NSFileManager, но я могу только представить, что NSBundle использует NSFileManager. (Так что это может быть связано)

Третье:
Не делайте ваши тесты зависимыми от ввода-вывода.
Я считаю, что это не цель Unit Test. Такой тест может не полагаться на файловую систему, базу данных, сетевое подключение и т.д.

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

Вам нужен только один тест, чтобы проверить, что абстракция.

Резюме

  • Первый улучшит вашу тестовую настройку.
  • Вторая, надеюсь, решит вашу тестовую проблему.
  • Третий будет уменьшать возникновение проблемы и улучшать ваш код.

Надеюсь, это было полезно.