[英]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.