中英文双版网站怎么做,服务器搭建虚拟主机,怀柔建设网站公司,绥芬河建设工程网站译自#xff1a;swiftandpainless.com/testing-pus… 上个月我写的关于使用 Swift 进行测试驱动开发的书终于出版了#xff0c;我会在本文和接下来的一些博文中介绍这本书撰写过程中的一些心得和体会。 在本文中#xff0c;我将会展示一种很好的用来测试一个视图控制器是否因…译自swiftandpainless.com/testing-pus… 上个月我写的关于使用 Swift 进行测试驱动开发的书终于出版了我会在本文和接下来的一些博文中介绍这本书撰写过程中的一些心得和体会。 在本文中我将会展示一种很好的用来测试一个视图控制器是否因为某个事件而被压入导航栈的方法。 假设我们在视图控制器上有一个按钮。当用户点击按钮时一个新的视图控制器应该被压入导航栈中。我们怎么测试这个呢 简单我们可以通过对导航栏控制器进行 Mock 的方式来达到我们的目的就像接下来这样 class MockNavigationController: UINavigationController {var pushedViewController: UIViewController?override func pushViewController(viewController: UIViewController, animated: Bool) {pushedViewController viewControllersuper.pushViewController(viewController, animated: true)}
}
复制代码确切地说这是部分 Mock。这里我们建立了一个 UINavigationController 的子类并且它只重写了父类的一个方法。这个 Mock 操作会在 pushViewController(_:animated:) 被调用时被触发并且会将传入的视图控制器也就是第一个参数保存下来。 测试代码如下所示 func testTappingPushButton_PushesDetailViewControllerOntoStack() {let viewController ViewController()let navigationController MockNavigationController(rootViewController: viewController)UIApplication.sharedApplication().keyWindow?.rootViewController navigationControllerguard let view viewController.view as? View else { XCTFail(); return }view.button.sendActionsForControlEvents(.TouchUpInside)XCTAssertTrue(navigationController.pushedViewController is DetailViewController)
}
复制代码首先我们将一个视图控制器设为我们 Mock 导航栏控制器实例的 rootViewController。然后我们将导航栏控制器设为 UIApplication 单例的 keyWindow 的 rootViewController。为了能够将一个视图控制器压入导航栈中视图控制器的视图必须位于视图层次里这一步是必须的。 下一步我们获取按钮并且向它发送 .TouchUpInside 事件。最后我们断言弹出的视图控制器是 DetailViewController 类型的。 你可以在 GitHub 上找到相应的示例代码。 你可以在我的书中找到更多贴近实际的测试例子。当你读这本书时请别忘了告诉我你对这本书的看法。 如有任何知识产权、版权问题或理论错误还请指正。 https://juejin.im/post/5a3217cd6fb9a045204c3ce5 转载请注明原作者及以上信息。