我一直在尝试使用像OHHTTPStubs这样的工具拦截和存储/模拟Xcode 7自动UI测试中的HTTP请求,但没有运气。
以下是我在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测试工作的方式可以阻止这种情况?有没有人能够做到这一点?
答案 0 :(得分:10)
正如Martijn正确指出的那样,由于UI测试的工作方式,您无法在运行时直接与应用程序进行交互,因此NSUserDefaults
中XCUITestCase
之类的任何HTTP模拟或操作都不会影响你的应用。
如果你真的需要能够模拟HTTP或设置&为特定的UI测试拆分您的应用程序环境,您需要在setUp()
的{{1}}方法中启动应用程序之前设置启动参数或启动环境变量,然后修改您的应用程序代码以读取启动参数或环境变量并引导测试环境。
示例TestCase
XCUITestCase
示例AppDelegate
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()
}
}
注意:为了在此示例中使用类似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模拟框架,您需要使用的存根代码和任何JSON装置都需要位于您的应用目标中,而不是测试目标。
这是一个非常有用的主题阅读主题:https://github.com/AliSoftware/OHHTTPStubs/issues/124
答案 1 :(得分:3)
UI测试在与您的应用程序不同的实例中运行。虽然您可以使用应用程序中的类,但它们只是一个副本。
在您的应用程序中,您可以使用此处提供的解决方案检测您是否在UI测试模式下运行:How to detect if iOS app is running in UI Testing mode
我个人采用了原帖中提到的launchEnvironment
解决方案;我的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
的自定义测试用例类,用这个添加覆盖那里的setUp然后使用在你所有的测试课程中。