Заголовок тестового представления с помощью 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];

Контроллер настроек по-прежнему равен нулю. Должен ли я использовать макеты? Кто-то предложил это для моего другого вопроса xctest - как проверить, загружается ли новое представление при нажатии кнопки

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


person U-L    schedule 10.12.2013    source источник


Ответы (1)


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

Вместо этого создайте экземпляр контроллера представления и загрузите его:

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

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

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

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

person Jon Reid    schedule 11.12.2013
comment
Еще раз спасибо Джон! Нужно ли мне когда-нибудь тестировать реальные взаимодействия? Тем не менее, я бы издевался над этим, я думаю, как вы показали в другом вопросе. - person U-L; 12.12.2013
comment
В общем, не бойтесь использовать реальные взаимодействия, если они быстрые и не вызывают постоянных изменений (которые могут испортить другие тесты). Другими словами, избегайте сети, файловой системы или постоянных баз данных. - person Jon Reid; 12.12.2013
comment
Спасибо, Джон. Я смотрю ваш сериал на YouTube на TDD. Очень познавательно для новичка вроде меня! - person U-L; 12.12.2013