如何在 Xcode 7 上模拟 UITest 中的数据?

How to mock data in UITest on Xcode 7?

有人试图在新的 Xcode 7 UI 测试中包含模拟数据?

我认为有很多方法可以解决这个问题 - 困难在于 Apple 有意将 UITests 设计为 运行 与被测应用程序完全分开。也就是说,您可以使用一些挂钩来协调应用程序中的逻辑与测试中的逻辑,以输入模拟数据或以任何方式改变应用程序的行为。我发现最有用的两个是 launchEnvironmentlaunchArguments.

在您的测试中 - XCUIApplication().launchArguments 对应于您应用代码中的 NSProcessInfo.processInfo().arguments

同样: XCUIApplication().launchEnvironment -> NSProcessInfo.processInfo().environment

launchEnvironment 是一个简单的字典,而启动参数是一个数组。在您的测试中,您可以在启动应用程序之前将您喜欢的任何值输入这些参数中的任何一个:

let app = XCUIApplication()
app.launchEnvironment["-FakedFeedResponse"] = "success.json"
app.launch()

然后在您的应用程序逻辑中,您可以随心所欲地打开这些值。类似于:

func fetchFeed() -> JSON {
    if let fakedJSONFilename = NSProcessInfo.processInfo().environment["-FakedFeedResponse"] {
        let fakePayload = fakeDataFileNamed(fakedJSONFilename)
        return fakePayload
    } else {
       //Make network call and return a real JSON payload 
    }
}

使用此模式,您的 faked/mock 数据将需要作为应用目标成员包含的文件。