所以,让我先解释一下我的问题。
我不想继续我的网络服务器数据,我想为我的XCUITests存根数据。 因此,我将确保它在100%时间内返回正确的数据,有时我需要测试一些特定的(例如错误或空状态)情况,这些情况下Web服务器可能无法返回。 所以,我尝试过,它是在我的XCUITest中运行本地server然后存根一些请求,但事实证明它没有用,因为XC UI测试在完全独立的包中运行(甚至是单独的进程) )并且本地服务器无法绑定到localhost,因此我的主应用程序包无法连接到此服务器。
我尝试的另一个解决方案是通过XCUIApplication()。launchArguments传递一些参数,并基于这个参数 - 在主应用程序上运行存根,但随后 - 这有点问题:“我有本地 - 主应用程序中的代理服务器“,我只需要进行UI测试。
我知道,我也可以创建存根服务器并将其暴露给网络,所以说,创建一种仅用于UI测试的开发环境,但对我来说这似乎是极端的。因为在这种情况下,只为我的项目维护UI测试是一项很大的工作。
所以,我的问题是,有没有人有更好的解决方案?有没有办法在不修改主应用程序和运行外部Web服务器的情况下解决这个问题?
答案 0 :(得分:1)
您可以使用SBTUITestTunnel。该库允许以简单的方式动态地存储网络请求(以及其他内容)。
添加库的最简单方法是使用cocoapods,然后覆盖AppDelegate的initialize方法:
import UIKit
import SBTUITestTunnel
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
override class func initialize() {
SBTUITestTunnelServer.takeOff()
super.initialize()
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
return true
}
}
一旦你添加了它,你就准备好了。您可以向UI测试的网络请求添加/删除存根,如下例所示:
func testThatSomethingStubbedWorks() {
let app = SBTUITunneledApplication()
app.launch()
let stubId = app.stubRequestsMatching:SBTRequestMatch(SBTRequestMatch.URL("google.com"), returnJsonDictionary: ["key": "value"], returnCode: 200, responseTime: SBTUITunnelStubsDownloadSpeed3G)
// from here on network request containing 'google.com' will return a JSON {"request" : "stubbed" }
...
app.stubRequestsRemoveWithId(stubId) // To remove the stub either use the identifier
app.stubRequestsRemoveAll() // or remove all active stubs
}