繁体   English   中英

使用Xcode 7 UI Automation模拟对象

[英]Mocking objects with Xcode 7 UI Automation

到目前为止,我正在使用KIF Framework进行iOS UI自动化。 KIF(也是单元测试)目标在与应用程序运行相同的过程中运行单元/ UI测试代码,我们可以轻松模拟应用程序使用的不同对象/类来显示模拟数据。

当切换到基于Xcode 7的新UI自动化时,我发现UI单元测试目标在单独的进程中运行,并且它在单独的进程中启动应用程序。 因此,无法通过单元测试访问App类/对象并模拟它们。

有没有人面临同样的问题,并了解任何解决方法?

如果需要更多细节,请告诉我。

答:请参阅下面的详细答案。 此处还有来自Apple开发者的回复链接: https//forums.developer.apple.com/thread/23552

因为您在不同的进程中运行,所以没有办法通过测试将mocks注入您的应用程序。 话虽如此,您确实可以控制应用程序的进程,因此可以对其产生一些影响。

我已经来回了解我对此的NSProcessInfo (我目前还未定),但您可以在应用中添加一些代码来读取环境变量(通过NSProcessInfo ),使应用程序的行为不同(即更改)你的依赖注入注入你的类,所以它使用模拟)。

这样做的缺点是模拟代码没有严格包含在测试包中,并且您最终会在应用程序中使用该代码(除非您使用#if语句来隔离它)。 显然,谨慎处理代码分支也很重要,因此不要使测试无效。

您可以在UI测试中启动应用程序之前设置环境变量:

let app = XCUIApplication()
app.launchEnvironment = ["UITestUseMocks" : "true"]
app.launch()

然后在您的应用程序中,您可以检查它,可能在#if语句中并更改您的行为:

#if TEST_TARGET
    if let useMocks = NSProcessInfo().environment["UITestUseMocks"] where useMocks == "true" {
        // Alter services used in dependency injection or some other testing behavior
    }
#endif

我一直在考虑这种方法来实现一个模拟服务层,它只是重放一些罐装服务器响应,所以我可以让我的UI测试不依赖于服务器响应(毕竟其他东西测试服务器)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM