2013-02-03 4 views
0

Я недавно пытался добавить некоторые (логические) модульные тесты в свой код. Я установил тесты с Kiwi, мне нравится стиль BDD и синтаксис.CLLocationManager и модульное тестирование

Моя проблема в том, что я пытаюсь проверить код, который полагается на CLLocationManager, отправив правильный locationManager:didUpdateToLocation:fromLocation:. Однако это никогда не происходит, когда я запускаю тест, предположительно потому, что CLLocationManager считает, что он не авторизовался. Для записи, я добавил файл .gpx к тестовой мишени и редактируются схему использовать этот файл в качестве места (под Edit Схеме ... ->Test ->Info). Тот же код отлично работает, когда я запускаю полное приложение в симуляторе. Любая идея, как я могу получить (смоделированные) обновления местоположения для отправки в тестовом примере?

ответ

2

Используйте инъекцию зависимости, чтобы указать менеджера местоположений, который вы хотите использовать. Вы можете:

  • Укажите его в качестве аргумента инициализатора (инъекции конструктора)
  • установить его в качестве свойства (инкубационные инъекций)

Попробуйте использовать инъекции конструктора, если вы можете.

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

+0

Я был обеспокоен тем, что это был единственный способ, но это означает, что мне нужно немного реорганизовать существующий код. Класс, который содержит CLLocationManager, является одиночным, поэтому, если я хочу использовать 'initWithManager:' вместо простого 'init', я не могу использовать метод класса sharedController для получения экземпляра. Затем вы предлагаете создать moker 'CLLocationManager', перехватить' startUpdatingLocation' и 'stopUpdatingLocation' и как-то вручную подать и массив экземпляров' CLLocation' в 'locationManager: didUpdateLocations:'? Какая боль ... – DaGaMs

+0

Этот ответ верный, но, как я указываю ниже, я все же решил использовать другой подход для простоты. – DaGaMs

+1

Синглтоны - это провал модульного тестирования. Есть другой способ. Выставляйте его как свойство для инъекции setter, но ваш инициализатор настроил разумное значение по умолчанию - в этом случае - желаемый синглтон. Затем ваши тесты могут заменить его. –

0

В конце концов я пошел по другому пути: я преобразовал свой логический тест в тест приложения, так что тест фактически запускается рядом с приложением в симуляторе. Это имеет решающее преимущество, что мне не нужно прыгать через обручи, чтобы получить [NSBundle mainBundle] и CLLocationManager, чтобы работать точно так же, как в приложении. Я предпочел бы концептуальную чистоту отдельного логического теста, но я не думаю, что имеет смысл переписать код именно для этого.

Смежные вопросы