2016-11-20 6 views
0

Я пытался настроить маршрутизатор для навигации вправо Viewcontroller. Когда я называю это в симуляторе, он работает нормально.Тестирование pushViewController в Swift

BUT: Когда я пытаюсь проверить результат этого перехода через свойство topViewController или представленное свойствоViewController моего контроллера NavigationController, я всегда получаю каждый Viewcontroller, но не правильный.

Мой метод выглядит следующим образом:

func navigateToViewController(_ viewController: UIViewController, animated: Bool) { 
    self.pushViewController(viewController, animated: animated) 
} 

Как я уже сказал. Он отлично работает в симуляторе, но я бы хотел его протестировать. Каждый раз, когда я называю это, ViewController правильно установлен. Но результат теста - это совсем другой контроллер.

Когда я утверждаю, что topViewController или представленViewController должен быть HomeViewController, я всегда получаю другой ViewController в качестве результата.

XCTAssertTrue(self.sut.topViewController is HomeViewController, 
        "The TopViewController should be set to the HomeViewController but instead: \(self.sut.topViewController)") 

Как это могло быть и как я могу это решить?

Большое спасибо.

С уважением

Nathalie

+0

Вы хотите провести единичный тест или тест пользовательского интерфейса? –

+0

Это должен быть модульный тест для моего маршрутизатора. Итак, все верно, включая представленный ViewController. – Maggy

+0

Похоже, ваш класс является подклассом или расширением NavigationController. Не могли бы вы поделиться с ним немного больше своего интерфейса? –

ответ

1

Не кажется, что это хороший способ провести тестирование эффектов звонка performSegue. Вместо этого мы можем сделать так: запись как его называли. В тестовом коде, добавьте это:

fileprivate var performSegueIdentifiers: [String] = [] 

extension ViewController { 
    override open func performSegue(withIdentifier identifier: String, sender: Any?) { 
     performSegueIdentifiers.append(identifier) 
    } 
} 

Это меняет ViewController-х performSegue. Вместо фактического выполнения segue мы добавляем идентификатор к performSegueIdentifiers. Поскольку это область содержимого, нам нужно быть осторожным, чтобы она не «сдавала» в другие тесты. Так сбросить его в setUp:

override func setUp() { 
     super.setUp() 
     performSegueIdentifiers = [] 
     // other set-up 
    } 

Теперь ваши тесты могут вызывать тест содержимое этого массива, чтобы определить:

  • число раз performSegue называли
  • Какие идентификаторы Segue были переданы ему

Мы можем с уверенностью сказать, что действует performSegue. Все, что нам нужно проверить, это то, что производственный код правильно назвал его.

+0

Спасибо, Джон за ваш ответ. Я попробую это прямо завтра утром. До сих пор звучит неплохо. Большое спасибо за вашу помощь. Благодарю. – Maggy

+0

Джон, ты мой герой. Оно работало завораживающе. Теперь я вижу, что было сделано, и может проверить это. Большое спасибо. – Maggy

0

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

for VC in (self.navigationController?.viewControllers)! { 
      print(VC.classForCoder) 
     } 

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

+0

Я сделал это, и контроллер не появился там. – Maggy

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