是否有可能在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,那么在启动XCUITestCase
的setUp()
方法中的应用程序之前,需要设置启动参数或启动环境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中使用它类。