OCUnit Протестируйте мое приложение с UINavigationController и UITableView - PullRequest
2 голосов
/ 07 сентября 2011

Я хочу написать тестовое приложение интеграции, чтобы проверить все операции CRUD. У меня есть табличное представление, чтобы перечислить все объекты. Пользователь может нажать кнопку «Добавить», чтобы нажать новый детализированный контроллер представления, чтобы добавить новый объект; Они могут щелкнуть на существующем объекте, чтобы выдвинуть контроллер детального вида, чтобы переименовать объект; Они также могут удалить объект из списка.

Я взволнован, чтобы попробовать OCUnit для тестирования моего приложения. Тем не менее, я столкнулся с некоторыми странными ошибками. Я использую UITabBarController + UINavigationController. У меня более 3 уровней pushViewController в моем UINavigationController. Если я тестирую код как есть с помощью [self.navigationController pushViewController: viewController animated: YES], он в основном работает с двумя предупреждениями:

nested push animation can result in corrupted navigation bar
nested pop animation can result in corrupted navigation bar

Я заметил, что viewDidAppear не вызывается, следовательно, предупреждения.

Затем я пытаюсь обойти, изменив анимированные: ДА на анимированные: НЕТ. Предупреждения уходят. Однако я столкнулся с еще одной ошибкой, когда viewDidLoad вообще не вызывается. Таким образом, представление не загружается из файла NIB, и все элементы управления IB равны нулю. Это был не тот случай, если я установил анимацию на ДА.

Это код, который я использую для получения дескриптора корневого контроллера представления в UINavigationController.

app = (MyAppDelegate*) [[UIApplication sharedApplication] delegate]; 
rootVC = ((MyViewController*)[[((UINavigationController*)[app.tabBarController.viewControllers objectAtIndex:0]) viewControllers] objectAtIndex:0]);

Я вручную вызвал этот код в своем тесте, чтобы смоделировать щелчок по UITableView:

[rootVC tableView:rootVC.tableView didSelectRowAtIndexPath:ip];  // push is called inside this

Так что я застрял, либо я установил анимированный: ДА, либо анимированный: НЕТ. Кто-нибудь успешно использует OCUnit для тестирования приложений с UINavigationController + UITableView? Если да, не могли бы вы поделиться примером кода или своим опытом?

1 Ответ

7 голосов
/ 07 сентября 2011

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

Для определенных видов тестов требуется, чтобы контроллер представления загружал свое перо - например, для создания табличного представления.Для этих тестов вызовите

[rootVC view];

Чтобы проверить, что контроллер представления выдвинут, используйте подкласс тестирования вашего фактического контроллера представления и переопределите navigationController, чтобы вернуть фиктивный объект, который вы можете проверить.Например,

@interface TestingMyViewController : MyViewController
@property(nonatomic, assign) UINavigationController *mockNavigationController;
@end

@implementation TestingMyViewController

@synthesize mockNavigationController;

- (UINavigationController *)navigationController
{
    return mockNavigationController;
}

@end

Затем ваш тест создаст TestingMyViewController и макет.Настройте макет и назначьте его подклассу тестирования.Вызовите метод, который вы хотите протестировать, затем убедитесь, что макет навигационного контроллера получил ожидаемый вами вызов с ожидаемым аргументом.

...