是否有可能在Xcode 7自动UItesting中存储HTTP请求?

我一直试图在Xcode 7自动UItesting中使用像OHHTTPStubs这样的工具拦截并存根/模拟HTTP请求,但是没有运气。

下面是一个例子,我试图在UItesting文件的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() } } 

有什么关于UItesting工作的方式来防止这种情况? 有没有人能够实现这一目标?

正如Martijn正确指出的那样,由于UItesting的工作原理,您不能在运行时直接与应用程序交互,所以对NSUserDefaults中任何类似NSUserDefaults HTTP NSUserDefaults或操纵都不会影响您的应用程序。

如果你真的需要能够嘲笑HTTP或设置和拆卸你的应用程序环境以进行特定的UItesting,那么在启动XCUITestCasesetUp()方法中的应用程序之前,需要设置启动参数或启动环境variables,然后修改应用程序代码来读取启动参数或环境variables并引导testing环境。

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

注意:为了在这个例子中使用HTTP嘲笑框架(如OHHTTPStubs ,需要使用的OHHTTPStubs代码和任何JSON fixture都需要放在app目标中,而不是testing目标。

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

UItesting是从应用程序的一个单独的实例中运行的。 尽pipe应用程序中的类可能会提供给您,但它们只是一个副本。

在您的应用程序中,您可以使用此处提供的解决scheme检测您是否在UItesting模式下运行: 如何检测iOS应用程序是否在UItesting模式下运行

我个人使用原始post中提到的launchEnvironment解决scheme; 我的setUp看起来像这样:

 override func setUp() { super.setUp() let app = XCUIApplication() app.launchEnvironment["TEST"] = "1" app.launch() } 

我的一个单例实例(称为RealmManager )看起来像这样(用于实例化一个Realm数据库):

 func realm() -> Realm { let dic = NSProcessInfo.processInfo().environment if dic["TEST"] != nil { return try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "test")) } return try! Realm() } 

如果你不喜欢这种重复,但是你可能已经复制了XCUIApplication().launch() ,你总是可以做一个扩展XCTestCase的自定义testing用例类,用这个添加项覆盖setUp,然后在你所有的testing中使用它类。