3

我试图测试一个可以呈现视图控制器的 segue。但是,总是失败。如何等待segue完成?请协助。

[self.viewController performSegueWithIdentifier:@"mySegueName" sender:self.viewController];
XCTAssertNotNil(self.viewController.presentedViewController, @"Failed to show modal view");
4

3 回答 3

8

问题是您试图在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);

}
于 2013-12-21T22:08:11.147 回答
1

提供一个 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)
    }
于 2017-03-07T13:43:32.593 回答
0

您是否考虑过使用 KIF?它是一个基于 Objective-C 的 UI 测试框架,与内置于应用程序的 Accessibility 框架集成(就像 UI 自动化所做的那样)。这使得它非常适合通过常规测试框架进行 UI 测试。

https://github.com/kif-framework/KIF

或按照本教程确保它是您想要的:

http://www.raywenderlich.com/61419/ios-ui-testing-with-kif

希望你找到你的解决方案!

于 2014-02-25T16:11:50.127 回答