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

dtr*_*enz 8 ios xcode7 xcode-ui-testing

我一直试图在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()
  }
}
Run Code Online (Sandbox Code Playgroud)

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

dtr*_*enz 10

正如马亭正确地指出,由于UI测试是如何工作的,你不能直接在运行时的应用程序进行交互,因此任何HTTP嘲讽或之类的东西操纵NSUserDefaultsXCUITestCase,不会影响您的应用程序.

如果你真的需要能够嘲笑HTTP或设置和拆毁你的应用环境,特定的UI测试,你将需要设置启动参数或启动应用程序之前推出的环境变量setUp()的方法XCUITestCase,然后修改您的应用程序代码读启动参数或环境变量并引导测试环境.

示例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()
  }

}
Run Code Online (Sandbox Code Playgroud)

示例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
}
Run Code Online (Sandbox Code Playgroud)

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

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