【问题标题】:XCTest how to perform segue that present a modal view and test presentedViewControllerXCTest 如何执行 segue 呈现模态视图并测试presentedViewController
【发布时间】:2013-12-17 10:49:09
【问题描述】:
我试图测试一个可以呈现视图控制器的 segue。但是,总是失败。如何等待segue完成?请帮忙。
[self.viewController performSegueWithIdentifier:@"mySegueName" sender:self.viewController];
XCTAssertNotNil(self.viewController.presentedViewController, @"Failed to show modal view");
【问题讨论】:
标签:
ios
objective-c
xcode
unit-testing
xctest
【解决方案1】:
问题是您试图在UIViewController 上呈现,其视图不在UIWindow 层次结构中。这是我的解决方案:
- (void)testExample {
//
// Arrange
// Storyboard
//
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
//
// Arrange
// View Controller
//
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[UIApplication sharedApplication].keyWindow.rootViewController = viewController;
//
// Act
//
[viewController performSegueWithIdentifier:@"ModalSegue" sender:nil];
//
// Assert
//
XCTAssertNotNil(viewController.presentedViewController);
}
【解决方案2】:
提供一个 Swift 3.0 答案,它也使用 Quick/Nimble 框架并通过在视图空间中“点击”执行 Segue 的按钮来执行 Segue。
// Note: there's also a beforeEach {} that sets up the mainViewController
describe("navigation") {
beforeEach {
// Access the view to trigger MainViewController.viewDidLoad().
let _ = mainViewController.view
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let window = appDelegate.window
window?.rootViewController = mainViewController
}
describe("the views navigationBar", closure: {
describe("left bar button item", closure: {
context("when pressed", closure: {
it("displays SomeViewController", closure: {
let item = mainViewController.navigationBar.topItem
let addItem = item?.leftBarButtonItem
tap(addItem!)
expect(mainViewController?.presentedViewController).toEventually(beAnInstanceOf(SomeViewController.self))
})
})
})
})
}
参考 tap() 方法:
func tap(_ barButtonItem: UIBarButtonItem) {
let _ = barButtonItem.target?.perform(barButtonItem.action, with: barButtonItem)
}