2013-12-10 2 views
1

Я использую XCtest для проверки названия представления. Попытка сначала привыкнуть писать тесты. Настройка выглядит какЗаголовок тестового просмотра с использованием XCTest

- (void)setUp 
{ 
    [super setUp]; 
    self.appDelegate = [[UIApplication sharedApplication] delegate]; 
    self.tipViewController = self.appDelegate.tipViewController; 
    self.tipView = self.tipViewController.view; 

    self.settingsViewController = self.appDelegate.settingsViewController; 
    self.settingsView = self.settingsViewController.view; 
} 

Проблема заключается в «settingsViewController». У меня есть две функции для фактического теста:

- (void) testTitleOfMainView{ 
    XCTAssertTrue([self.tipViewController.title isEqualToString:@"Tip Calculator"], @"The title should be Tip Calculator"); 
    //why does this not work? 
    // XCTAssertEqual(self.tipViewController.title, @"Tip Calculator", @"The title should be Tip Calculator"); 
} 

- (void) testTitleOfSettingsView{ 
    //make the setttings view visible 
    [self.tipViewController onSettingsButton]; 

    //test the title 
    XCTAssertTrue([self.settingsViewController.title isEqualToString:@"Settings"], @"The title should be Settings"); 
} 

Работает «testTitleOfMainView». Но «testTitleOfSettingsView терпит неудачу как self.settingsViewController равна нулю. Я вроде понимаю, почему. Вид не был инициализирован до сих пор. Так что я попытался отправить сообщение на основной контроллер, который приносит settignscontroller ввиду

[self.tipViewController onSettingsButton]; 

settingsController по-прежнему равна нулю. Должен ли я использовать издевается? Кто-то предложил это мой другой вопрос xctest - how to test if a new view loads on a button press

Должен ли я подкласс settingsview и привести его вручную? Спасибо.

ответ

8

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

Вместо инстанцирует контроллер представления о себе, и иметь его груз:

- (void)testTitleOfSettingsView 
{ 
    SettingsViewController *sut = [[SettingsViewController alloc] init]; 

    [sut view]; // Accessing the view causes it to load 

    XCTAssertEquals(@"Settings", sut.title); 
} 

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

+0

Еще раз спасибо! Должен ли я когда-либо испытывать реальные взаимодействия? Тем не менее, я бы издевался над этим, я думаю, как вы показали в другом вопросе. –

+0

В общем, не бойтесь использовать реальные взаимодействия до тех пор, пока они бывают быстрыми и не вызывают постоянных изменений (что может испортить другие тесты). Другими словами, избегайте создания сетей, файловой системы или постоянных баз данных. –

+0

Спасибо, Джон. Я смотрю вашу серию youtube на TDD. Очень информационный для новичка, как я! –

 Смежные вопросы

  • Нет связанных вопросов^_^