Мы пытаемся написать наши пользовательские модульные тесты для тестирования каждого контроллера просмотра отдельно. Я знаю, что есть автоматизация пользовательского интерфейса, KIF и другие решения, однако, если вы посмотрите на вышеприведенный код, вы обнаружите, что это можно сделать без их использования.Как написать единичный тест для тестирования контроллера просмотра?
Итак, для простоты предположим, что есть простой контроллер представлений с двумя общедоступными методами «setFirstState» и «setSecondState». Мне нужно проверить, вызван ли метод setFirstState, когда контроллер представления полностью создан и показан на экране (идет через viewDidLoad). Вот демонстрационный вид контроллер:
@interface MyViewController
- (void)setFirstState;
- (void)setSecondState;
@end
@implementation MyViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self setFirstState];
}
@end
Таким образом, тестовый модуль для тестирования setFirstState вызова может выглядеть следующим образом (с помощью XCTest и OCMock):
- (void)test_viewDidLoad_CallsMyMethod {
MyViewController *viewContoller = [[MyViewController alloc] init];
id mock = [OCMockObject partialMockForObject:viewContoller];
[[mock expect] showLogin];
[UIApplication sharedApplication].keyWindow.rootViewController = (MyViewController *)mock;
[mock verify];
}
Интересной строка коды является один назначая макет (на ViewController) для rootViewController keyWindow. Мы обнаружили, что нам нужно это сделать, если мы хотим, чтобы методы viewDidLoad, viewWillAppear, вызывались. В противном случае они не будут вызваны. Однако, если мы запускаем тесты, то симулятор висит на этой линии. Xcode показывает, что он работает и все еще жив, но он не идет дальше.
Мы также попытались заменить строку кода rootViewController keyWindow на «[mock viewDidLoad]» только для имитации и тестирования viewDidLoad, но она также зависает. Таким образом, похоже, что частичный макет прерывает внутренний поток появляющегося контроллера вида.
Если мы удалим макет и назначим контроллер вида непосредственно на rootViewController от keyWindow, тогда он будет работать, и мы сможем проверить все остальное. Однако, может быть, у кого-нибудь есть идея, как мы могли это исправить?
ОБНОВЛЕНИЕ Вспомним, что мы используем Xibs вместо раскадровки, поэтому каждый компонент в нашей системе слабо связан.
Доступ к представлению свойства и видуDidLoad будет вызываться. Просто вызовите viewWillAppear и т. Д. В своих реальных тестах для этих методов. – InsertWittyName
Nop, заменив строку кода rootViewController keyWindow на «UIView * view = [mock view];» не помогает. Он также висит. – Centurion