Как проверить код, который зависит от UIUserInterfaceIdiom (IOS) - PullRequest
4 голосов
/ 16 января 2012

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

[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad

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

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

Для справки: хороший пост в блоге со многими ссылками , руководство по тестированию Apple и Пример кода проекта модульного теста .

1 Ответ

4 голосов
/ 01 июля 2012

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

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

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

Как вам удалось обойти это?

...