我试图测试一个可以呈现视图控制器的 segue。但是,总是失败。如何等待segue完成?请协助。
[self.viewController performSegueWithIdentifier:@"mySegueName" sender:self.viewController];
XCTAssertNotNil(self.viewController.presentedViewController, @"Failed to show modal view");
我试图测试一个可以呈现视图控制器的 segue。但是,总是失败。如何等待segue完成?请协助。
[self.viewController performSegueWithIdentifier:@"mySegueName" sender:self.viewController];
XCTAssertNotNil(self.viewController.presentedViewController, @"Failed to show modal view");
问题是您试图在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);
}
提供一个 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)
}
您是否考虑过使用 KIF?它是一个基于 Objective-C 的 UI 测试框架,与内置于应用程序的 Accessibility 框架集成(就像 UI 自动化所做的那样)。这使得它非常适合通过常规测试框架进行 UI 测试。
https://github.com/kif-framework/KIF
或按照本教程确保它是您想要的:
http://www.raywenderlich.com/61419/ios-ui-testing-with-kif
希望你找到你的解决方案!