Тестирование iPhone: тестирование IBOutlets - PullRequest
2 голосов
/ 31 декабря 2011

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

Допустим, у меня есть экземпляр UIViewController (называемый MyViewController), в котором просто есть один IBOutlet для UITextField, и когда страница загружается, я либо устанавливаю его в значение Enabled, либо не на основе свойства BOOL.

- (void)viewDidLoad {
    [super viewDidLoad];
    self.surname.enabled = self.allowTextField;
}

Все подключено правильно, и когда я запускаю приложение, оно работает как положено (лорд - я надеюсь, потому что, если я не смогу сделать эту часть правильно, я, вероятно, не должен писать приложения для iPhone ...) ,

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

-(void)testFieldEnabled {
    MyViewController *myController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
    myController.allowTextField = YES;
    [myController viewDidLoad];
     STAssertTrue(myController.surname.enabled, @"Why is this not correct?");
}

Я сохранил этот пример чрезвычайно простым, потому что я действительно не понимаю, почему это не работает, и считаю, что это должно быть из-за серьезного сбоя в моем понимании модульного тестирования. Разве вышеприведенный модульный тест не должен запустить экземпляр страницы MyViewController, установить свойство, запустить метод и вернуть true? В данный момент мне постоянно говорят, что текстовое поле фамилии не включено.

Спасибо за вашу помощь и счастливого нового года всем вам!

Ответы [ 3 ]

3 голосов
/ 31 декабря 2011

Попробуйте выполнить следующее:

-(void)testFieldEnabled {
   MyViewController *myController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
   [myController view];
   myController.allowTextField = YES;
   STAssertTrue(myController.surname.enabled, @"Why is this not correct?");
}

viewDidLoad будет вызывать только ваш метод делегата с вашим кодом инициализации.Это не будет делать фактическую загрузку просмотра.Кроме того, вам нужно установить allowTextField после загрузки представления, так как в противном случае оно будет переопределено со значением по умолчанию.

3 голосов
/ 31 декабря 2011

Это потому, что вызов viewDidLoad вручную не загружает представление.Вы должны вызвать свойство view контроллера представления, которое автоматически загрузит представление (или вызвать loadView вручную).

0 голосов
/ 06 августа 2015

Вы можете использовать «Load View» вместо «View and Load». Вы также должны описать «Load View» в My View Controller

...