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

dam*_*i86 10 mocking ui-testing ios xcode7 xcode-ui-testing

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

  • 你使用过特定的框架吗?
  • 你是如何管理目标的?

Tuc*_*man 9

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

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

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

launchEnvironment是一个直接的字典,而launch参数是一个数组.在测试中,您可以在启动应用程序之前将任何您喜欢的值提供给这些参数中的任何一个:

let app = XCUIApplication()
app.launchEnvironment["-FakedFeedResponse"] = "success.json"
app.launch()
Run Code Online (Sandbox Code Playgroud)

然后在您的应用程序逻辑中,您可以根据需要打开这些值.就像是:

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 
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此模式,您的伪造/模拟数据将需要是作为应用目标成员包含的文件.

  • 使用与测试相关的代码污染您的代码是非常愚蠢的,例如在这种情况下检查它是假的feed还是应该从服务器获取... (2认同)