我一直试图在
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