Модульные тесты командной строки iPhone (и файловый ввод / вывод) - PullRequest
31 голосов
/ 27 сентября 2011

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

Длинный вопрос собъяснение: Это в конечном итоге станет сценарием для автоматического создания / тестирования моей сборки iPhone через экземпляр Hudson.По ссылке Макдада на этот ТАК вопрос позволил мне успешно запустить модульные тесты из командной строки (полу).

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

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

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

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

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

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

1 Ответ

3 голосов
/ 20 декабря 2011

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

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

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

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

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

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

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

Вам понадобится только один тест для проверки этой абстракции.

Резюме

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

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

...