我一直试图拦截Xcode 7自动UI测试中的存根/模拟HTTP请求,使用OHHTTPStubs之类的工具,但没有成功。
下面是一个示例,说明我如何在UI测试文件的OHHTTPStubs方法中使用setUp方法捕获任何HTTP请求:
override func setUp() {
super.setUp()
let matcher: OHHTTPStubsTestBlock = { (request) -> Bool in
return true
}
OHHTTPStubs.stubRequestsPassingTest(matcher) { (response) -> OHHTTPStubsResponse! in
return OHHTTPStubsResponse.init()
}
}关于UI测试的工作方式是否有防止这种情况发生的原因?有人能做到这一点吗?
发布于 2015-10-08 15:04:25
正如Martijn正确地指出的那样,由于UI测试的工作方式,您不能在运行时直接与应用程序交互,所以在XCUITestCase中对XCUITestCase之类的东西的任何HTTP模拟或操作都不会影响应用程序。
如果您真的需要能够模拟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()
}
}示例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 ),您需要使用的固执代码和任何JSON安装都需要在应用程序目标中,而不是测试目标中。
这是一个非常有用的主题:https://github.com/AliSoftware/OHHTTPStubs/issues/124
发布于 2015-09-29 10:32:22
UI测试是在与应用程序不同的实例中运行的。虽然应用程序中的类可能对您可用,但它们只是一个副本。
在您的应用程序中,您可以检测您是否运行在UI测试模式中,其中提供了以下解决方案:如何检测iOS应用程序是否在用户界面测试模式下运行
我亲自使用了最初文章中提到的launchEnvironment解决方案;我的setUp如下所示:
override func setUp() {
super.setUp()
let app = XCUIApplication()
app.launchEnvironment["TEST"] = "1"
app.launch()
}我的一个单例实例器(称为RealmManager)看起来如下(用于实例化一个领域数据库):
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的自定义测试用例类,用这个加法覆盖setUp,然后在所有测试类中使用它。
https://stackoverflow.com/questions/32827592
复制相似问题