Unit Test Swift-casting контроллер просмотра из раскадровки не работает

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

class AboutViewController_Tests: XCTestCase
{
//var storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.dynamicType)) // Used in swift 1.1

var storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle:NSBundle.mainBundle()) // Replaced this in swift 1.2
var aboutViewController:AboutViewController!

override func setUp()
{
super.setUp()
aboutViewController = storyboard.instantiateViewControllerWithIdentifier("AboutViewController") as! AboutViewController
aboutViewController.viewDidLoad()
XCTAssertNotNil(aboutViewController, "About not nil")
}
}

Ошибка при запуске unit test

Невозможно передать значение типа "testProject.AboutViewController" (0x105b0ad30) в "testProjectTests.AboutViewController" (0x116e51d20).

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

Ответ 1

У меня была та же проблема и решение:

  • Добавить раскадровку Main и AboutViewController в тестовую цель
  • Замените UIStoryboard(name: "Main", bundle:NSBundle.mainBundle()) на UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.classForCoder))

Таким образом вы будете загружать раскадровку и инициализировать контроллер из тестового целевого пакета, а не использовать его из основного целевого пакета. Подробнее просмотрите эту ссылку

Ответ 2

Я столкнулся с той же проблемой несколько минут назад. Вот как я решил это.

  • Добавить раскадровку в цель тестирования
  • Загрузите контроллер представления следующим образом:
var storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle:NSBundle(forClass: self.dynamicType))

self.vc = storyboard.instantiateViewControllerWithIdentifier("gettingStartedView") as! MainViewController

self.vc.loadView()

Надеюсь, это поможет!

Ответ 3

Попробуйте это сработало

class VehicleListControllerSpecs: XCTestCase {

var listController: VehicleListController!

override func setUp() {
    super.setUp()
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewController(withIdentifier: "VehicleListController") as! VehicleListController
listController = vc
    _ = listController.view
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

func testListViewHasTableView() {
    XCTAssertNotNil(listController.tableView,"view doesnt has tableview")
}
}