2012-01-16 2 views
4

У меня есть код Objective-C [i-os], который я бы хотел запустить с помощью XCode. Он обращается к различным метаданным в зависимости от типа устройства, с помощью:Как проверить код, который зависит от UIUserInterfaceIdiom (ios)

[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad

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

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

Справочные, nice blog post with many links, Apple Unit testing guide и Unit test sample code project.

ответ

4

Я попробовал несколько различных подходов утром:

  1. Используя категорию, которая только связана с моей тестовой цели. В этой категории я бы переопределил currentDevice с реализацией partialMock (OCMock) и заглушил необходимый метод, чтобы он возвращал Pad или Phone принудительно к моим спецификациям. У него должна быть работа, но очень сложно возиться с такими классами, как или UIApplication, симулятор часто падает, что является плохим знаком.

  2. #undef UI_INTERFACE_IDIOM() и #define это на мой тест .pch. Указывая UI_INTERFACE_IDIOM() на реализацию в одном экземпляре одиночного экземпляра, который я мог бы установить для Pad или Phone соответственно. Это сработало, но главная проблема заключается в том, что при запуске тестов симулятор также идет вверх (тесты приложений, которые есть), поэтому, если вы выполняете тесты на iPad, ваш тест пройдет, но другие части симулятора потерпят неудачу, потому что от противоречивых ответов, которые он получает от UI_INTERFACE_IDIOM() (одна из таких - загрузка специфичного для iPhone плеера, если вы находитесь в среде универсального приложения)

  3. Я думаю, что это лучший подход. Как и все в информатике, просто введите другой слой в =) Вместо кода, использующего UI_INTERFACE_IDIOM(), чтобы оценить, находится ли он на устройстве Pad или Phone, инкапсулируйте эту логику в объект, который вы можете издеваться во время тестов. Таким образом, UI_INTERFACE_IDIOM() по-прежнему будет доступен для остальной части симулятора. Ваш производственный код на самом деле будет опираться на него, но ваши тесты будут опираться на пропущенную реализацию, которая может отвечать как ожидалось в ваших тестах.

Если вы хотите, я могу поделиться некоторыми кодами по этому вопросу. И да, это изнуренный!

Как вам удалось обходным путем?

+0

Добро пожаловать в SO и хороший первый ответ! +1. Я боюсь, что я отказался от этого на данный момент - автоматическое тестирование - это грязное слово на моем рабочем месте, и я больше заинтересован в том, чтобы сначала установить Source Control. Сказав это, я хотел бы получить его в конце концов, и кажется, что автоматическое тестирование намного сложнее, чем должно быть на данный момент. Любые дополнительные данные, которые вы могли бы дать, были бы оценены. Благодарю. –

+0

Что бы вы ни делали, не сдавайтесь !!! Возможно, это поможет: http://www.amazon.com/Test-Driven-iOS-Development-Developers-Library/dp/0321774183 –

+0

Спасибо за ссылку! Я посмотрю. –