从故事板实例化视图控制器时出现XCTestCase错误

时间:2016-01-12 01:24:13

标签: ios swift unit-testing

我在swift中使用单元测试时很新,当我尝试创建用于测量性能的单元测试时,我遇到了错误。

这是我的测试用例的代码。

func testPerformaceFetchSearchResult(){
    //let ICD9ViewController = ICD9Controller() //this is not working since i need the IBOutlet also
    var ICD9ViewController:ICD9Controller!

    let storyboard:UIStoryboard = UIStoryboard(name: "Main", bundle:NSBundle(forClass: self.dynamicType))
    ICD9ViewController = storyboard.instantiateViewControllerWithIdentifier("ICD9Controller") as! ICD9Controller
    ICD9ViewController.beginAppearanceTransition(true, animated: false)

    ICD9ViewController.code = "0"
    ICD9ViewController.name = ""
    ICD9ViewController.desc = ""
    ICD9ViewController.sortBy = 1
    ICD9ViewController.customPage.pageNo = 1
    ICD9ViewController.customPage.pageSize = 10

    self.measureBlock(){
        ICD9ViewController.fetchSearchResult()
    }
}

错误在此行

ICD9ViewController = storyboard.instantiateViewControllerWithIdentifier("ICD9Controller") as! ICD9Controller

错误信息是

  

无法将类型' appName .ICD9Controller'(地址)的值转换为' appName .ICD9Controller'( differentAddress < / em>的)

我已经阅读了几个关于XCTestCase的问题,并且大多数错误都无法将_appName_.viewController类型的值转换为_appNameTests_.viewController,这对我来说并非如此,因为我已经检查了我的目标成员资格故事板和我的控制器。

我的问题是,如何从故事板中实例化视图控制器以进行单元测试?

2 个答案:

答案 0 :(得分:1)

视图控制器和故事板应仅在应用程序目标上可用,然后您可以使用@testable在测试中访问它。

检查此post是否对您有所帮助。另外,如果这不起作用,请尝试使用NSBundle.mainBundle()代替测试包。

答案 1 :(得分:1)

经过两天的挣扎,我终于找到了根本问题。

问题是强制转换问题,在我的案例中有两个名称相同的模块 appName 。这使得xCode感到困惑,这就是它无法转换视图控制器的原因。

由于模块名称通常以产品名称为源,我更改了测试产品名称,最终解决了我的问题。