2

我有一个 iOS 应用程序,我想通过代码测试它的 UI(使用单元测试)。我想模仿用户的活动和故事板活动:点击按钮,点击 barbutton,写入文本字段,执行 segue。

我有问题。我在 NavigationController 中有一个 TableViewConrtoller。首先,如何从代码中访问 TableViewController?

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    UINavigationController *nav = [storyboard instantiateInitialViewController];
    GoodHabitsViewController *good = [nav.viewControllers objectAtIndex:0];

    NSLog(@"%@", good.addButton.title);

    [good performSegueWithIdentifier:@"AddGoodHabitSegue" sender:good];

NSLog 写入正确的值,按钮的标题是“add”,并且“add”出现在日志中。但是在 performSequeWithIdentifier 之后会出现以下警告:

Warning: Attempt to present <AddGoodHabitViewController: 0x74c8310> on <UINavigationController: 0x764e120> whose view is not in the window hierarchy!

如何执行序列,如何推送 addButton (UIBarButton) 以及如何引用AddGoodHabitViewController(segue 指向的位置)。

4

4 回答 4

4

有两种测试可以在 OCUnit 平台上运行——所谓的“应用程序”测试和所谓的“逻辑”测试。

  • 只有“应用程序”测试允许您练习 UIViewControllers、UIViews 等。如果您在创建项目时指定了“创建测试目标”,它将使用“应用程序”样式。否则,稍后添加测试集目标,默认情况下使用“逻辑”样式。为了隐藏现有的测试目标以使用“应用程序”测试,TwoBit Labs 有一个很好的:指南

  • 另一种练习代码直至视图控制器和视图的方法是使用Cedar BDD 测试框架。Cedar 测试在 iOS 应用程序内部运行,因此除了能够测试 ViewControllers 和 Views 之外,它还可以在设备或模拟器上进行测试。

  • UIAutomation 允许通过驱动 UI 本身(而不是执行 UI 代码)来执行自动化功能测试。UIAutomation 的问题是,据我所知,它不可能从命令行执行它,因此很难包含在自动化测试套件中——一个由持续集成服务器运行的测试套件。. . . 有人可能会使用 Automator.app 或类似的工具来解决这个问题,但到目前为止还没有。

  • Calabash是另一个很棒的 UI 测试框架,可以从 cmd-line 运行,因此不受我上面描述的限制,wrt UIAutomation。

  • 请记住,自动化功能测试和在代码级别测试 UIViewControllers 和 Views 是两个非常不同的事情。后者当然有价值,只需要正确设置捆绑加载器即可。

更新:对于最新版本的 Xcode 5+,应用程序样式测试是默认设置。

于 2013-04-14T12:08:18.390 回答
2

正如错误消息指出的那样,问题在于您试图在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
    //
    XCTAssertEqualObjects(viewController.presentedViewController.title, @"Second");

}
于 2013-12-21T22:17:49.730 回答
0

单元测试(即通过 Xcode 模板向项目添加单元测试时获得的那些)不是用于测试您的 UI。您需要查看UI 自动化,它允许您使用 JavaScript 编写 UI 操作。

于 2013-04-14T07:40:13.753 回答
0

查看 KIF。这听起来几乎是你需要的:

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

它是一个基于 Objective-C 的 UI 测试框架,与内置于应用程序的 Accessibility 框架集成(就像 UI 自动化所做的那样)。

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

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

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

于 2014-02-25T16:05:14.350 回答