Я недавно пытался добавить некоторые (логические) модульные тесты в свой код. Я установил тесты с Kiwi, мне нравится стиль BDD и синтаксис.CLLocationManager и модульное тестирование
Моя проблема в том, что я пытаюсь проверить код, который полагается на CLLocationManager
, отправив правильный locationManager:didUpdateToLocation:fromLocation:
. Однако это никогда не происходит, когда я запускаю тест, предположительно потому, что CLLocationManager
считает, что он не авторизовался. Для записи, я добавил файл .gpx к тестовой мишени и редактируются схему использовать этот файл в качестве места (под Edit Схеме ... ->Test ->Info). Тот же код отлично работает, когда я запускаю полное приложение в симуляторе. Любая идея, как я могу получить (смоделированные) обновления местоположения для отправки в тестовом примере?
Я был обеспокоен тем, что это был единственный способ, но это означает, что мне нужно немного реорганизовать существующий код. Класс, который содержит CLLocationManager, является одиночным, поэтому, если я хочу использовать 'initWithManager:' вместо простого 'init', я не могу использовать метод класса sharedController для получения экземпляра. Затем вы предлагаете создать moker 'CLLocationManager', перехватить' startUpdatingLocation' и 'stopUpdatingLocation' и как-то вручную подать и массив экземпляров' CLLocation' в 'locationManager: didUpdateLocations:'? Какая боль ... – DaGaMs
Этот ответ верный, но, как я указываю ниже, я все же решил использовать другой подход для простоты. – DaGaMs
Синглтоны - это провал модульного тестирования. Есть другой способ. Выставляйте его как свойство для инъекции setter, но ваш инициализатор настроил разумное значение по умолчанию - в этом случае - желаемый синглтон. Затем ваши тесты могут заменить его. –