我试图在我的项目中添加一些单元测试来测试视图控制器.但是我似乎遇到了看似简单的问题.我已经创建了一个示例项目,我将参考该项目.https://github.com/pangers/ViewControllerTesting
该示例包含一个UINavigationController作为初始视图控制器.UINavigationController的根视图控制器是FirstViewController.FirstViewController上有一个按钮,它可以切换到SecondViewController.在SecondViewController中有一个空文本字段.
我想添加的两个测试是:
1)FirstViewController中的检查按钮标题是"下一屏幕".
2)检查SecondViewController中的文本字段是否为空,"".
我听说有关将swift文件添加到主目标并且测试目标不是好习惯的报告.但是,最好在公共测试中创建您想要访问的任何内容,并将主目标导入测试中.这就是我所做的.(我还将主要目标的"定义模块"设置为YES,因为这是我在几篇文章中所读到的).
在FirstViewControllerTests中,我使用以下代码实例化了第一个视图控制器:
var viewController: FirstViewController!
override func setUp() {
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.dynamicType))
let navigationController = storyboard.instantiateInitialViewController() as UINavigationController
viewController = navigationController.topViewController as FirstViewController
viewController.viewDidLoad()
}
Run Code Online (Sandbox Code Playgroud)
我添加了测试:
func testCheckButtonHasTextNextScreen() {
XCTAssertEqual(viewController.button.currentTitle!, "Next Screen", "Button should say Next Screen")
}
Run Code Online (Sandbox Code Playgroud)
同样,对于SecondViewControllerTest,我使用以下方法进行设置:
var secondViewController:SecondViewController!
override func setUp() {
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.dynamicType))
let navigationController = storyboard.instantiateInitialViewController() as UINavigationController
let firstviewController = navigationController.topViewController as FirstViewController
firstviewController.performSegueWithIdentifier("FirstToSecond", sender: nil)
secondViewController …Run Code Online (Sandbox Code Playgroud) 假设我从一个笔尖加载了一个视图控制器,并决定对场景后面的一个子视图做一些事情.在稍后的时刻,我会显示这个视图控制器的视图.
viewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[viewController.someSubview doSomething];
//later on
[mainView addSubview:viewController.view];
Run Code Online (Sandbox Code Playgroud)
问题是,在视图出现之前似乎没有加载someSubview对象,因此不调用doSomething方法.到目前为止,我的解决方法是致电:
[mainView addSubview:viewController.view];
[viewController.view removeFromSuperview];
Run Code Online (Sandbox Code Playgroud)
首先初始化viewcontroller的子视图.有没有更优雅的方式(如loadSubviews方法或其他东西)为此任务?