【发布时间】:2021-07-26 02:59:00
【问题描述】:
我正在使用标准的 XCTestCase 类与宿主 ios 应用程序一起实现和触发单元测试。 是否可以将单元测试(XCTestCase 子类)中的一条信息传递给宿主应用程序,并在宿主的 main.m 中读取此信息?
XCUIApplication().launchArguments 不适合我。在构建设置中添加值也不是解决方案。
我需要根据 XCTestCase 的子类更改宿主应用程序的行为。
被测类(XCTestCase 的子类)受宿主的 App Delegate 类影响。我想实例化一个不会影响被测类的特殊 AppDelegateFake 类(在 main.m 中)。
可以检测宿主应用程序是否使用单元测试集运行并实例化一个特殊的假测试应用程序委托类: https://marcosantadev.com/fake-appdelegate-unit-testing-swift/
但是这样我就必须使用这个假的应用程序委托进行 ALL 测试(XCTestCase's)。
如果在宿主应用程序中有这样的东西会很好:
let isRunningTests = NSClassFromString("XCTestCaseSubclassXY") != nil
但不幸的是,这是不可能的。我还试图以某种方式获取 XCTestConfiguration 的实例,其中包含正在运行的 XCTestCase 名称,但同样不可能。
谢谢。
【问题讨论】:
-
你能更详细地解释你的问题是什么吗?据我了解,应用程序应该独立于其测试。即使您的应用具有测试驱动设计,也没有必要根据当前测试更改应用的行为。
-
@ReinhardMänner 感谢您的回复。我已经更新了帖子。
-
现在我明白了。我这样做,在我的
XCTestCase子类中使用XCUIApplication().launchArguments = "-isUITesting",在我的main.swift 文件中使用let isUITesting = ProcessInfo.processInfo.arguments.contains("-isUITesting“)。你提到这对你不起作用。为什么?会发生什么? -
@ReinhardMänner 原则上,这是我所要求的,这是不可能的。对于单元测试,有一个正在运行的应用程序的主机实例。另一方面,对于 UI 测试,每次都会加载一个专用应用程序 - 并且可以使用 XCUIApplication().launchArguments 进行配置
-
所以在测试运行时你想要一个不同的 App Delegate,对吗?您的应用是否使用场景委托启动?