ios – 是否可以在Xcode 7自动UI测试中存根HTTP请求?

我一直试图在 Xcode 7自动UI测试中拦截和存根/模拟HTTP请求,使用像 OHHTTPStubs这样的工具,没有运气.

以下是我尝试在UI测试文件的setUp方法中使用OHHTTPStubs捕获任何HTTP请求的示例:

override func setUp() {
  super.setUp()

  let matcher: OHHTTPStubsTestBlock = { (request) -> Bool in
    return true
  }

  OHHTTPStubs.stubRequestsPassingTest(matcher) { (response) -> OHHTTPStubsResponse! in
    return OHHTTPStubsResponse.init()
  }
}

有没有关于UI测试的工作方式可以防止这种情况?有没有人能够实现这一目标?

解决方法

正如Martijn正确指出的那样,由于UI测试的工作方式,您无法在运行时直接与应用程序进行交互,因此任何HTTP模拟或操作XCUITestCase中的NSUserDefaults都不会影响您的应用程序.

如果你真的需要能够模拟HTTP或设置&为特定的UI测试拆分您的应用程序环境,您需要在XCUITestCase的setUp()方法中启动应用程序之前设置启动参数或启动环境变量,然后修改您的应用程序代码以读取启动参数或环境变量并引导测试环境.

示例TestCase

class MyTestCase: XCTestCase {

  /**
  Called before each test in this test case.
  */
  override func setUp() {
    super.setUp()

      let app = XCUIApplication()
      app.launchArguments = [ "STUB_HTTP_ENDPOINTS" ]
      app.launch()
  }

}

示例AppDelegate

func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

#if DEBUG
  if (nsprocessInfo.processInfo().arguments.contains("STUB_HTTP_ENDPOINTS")) {
    // setup HTTP stubs for tests
  }
#endif

  return true
}

注意:为了在此示例中使用类似OHHTTPStubs的HTTP模拟框架,您需要使用的存根代码和任何JSON装置都需要位于您的应用目标中,而不是测试目标.

这是一个非常有用的线程来阅读这个主题https://github.com/AliSoftware/OHHTTPStubs/issues/124

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...