获取ios主机应用中单元测试类的名称

问题描述

我使用标准的 XCTestCase 类与主机 ios 应用程序一起实现和触发单元测试。 是否可以将单元测试(XCTestCase 子类)中的一条信息传递给宿主应用程序,并在宿主的 main.m 中读取此信息?

XCUIApplication().launchArguments 对我不起作用。在构建设置中设置值也不是解决方案。

我需要根据 XCTestCase 的子类更改宿主应用程序的行为。

被测类(XCTestCase的子类)受宿主的App Delegate类影响。我想实例化一个特殊的 AppDelegateFake 类(在 main.m 中),它不会影响被测类。

可以检测宿主应用程序是否使用单元测试集运行并实例化一个特殊的假测试应用程序委托类: https://marcosantadev.com/fake-appdelegate-unit-testing-swift/

但是这样我就必须使用这个虚假的应用程序委托进行所有测试(XCTestCase的)。

如果在宿主应用程序中有这样的东西就好了:

let isRunningTests = NSClassFromString("XCTestCaseSubclassXY") != nil

但不幸的是,这是不可能的。我还尝试以某种方式获取 XCTestConfiguration 的实例,其中包含正在运行的 XCTestCase 名称,但同样不可能。

谢谢。

解决方法

我通常在测试中包含一个 TestingAppDelegate。当单元测试运行时,它们在启动之前被注入到正在运行的应用程序中。因此,生产代码可以检查 TestingAppDelegate 是否存在并决定使用哪个应用委托。

在我使用单个替换应用程序委托的用例中,我在 main.swift 中执行以下操作:

let appDelegateClass: AnyClass =
    NSClassFromString("TestingAppDelegate") ?? AppDelegate.self

这将搜索具有给定名称的类,并在存在时使用它。否则,它将回退到常规生产代码 AppDelegate。然后我用它来启动应用程序:

UIApplicationMain(
    CommandLine.argc,CommandLine.unsafeArgv,nil,NSStringFromClass(appDelegateClass)
)

但这种技术不适用于使用场景委托启动的应用,因为场景会在启动之间缓存。

我无法想象为什么您需要多个应用委托进行测试。如果要在启动时配置不同的设置,我会在测试部分的“参数”选项卡“启动时传递的参数”中的方案级别指定这些设置。 TestingAppDelegate 然后可以从 UserDefaults 读取这些参数。

,

原则上,这是不可能的,我所要求的。对于单元测试,有一个正在运行的主机应用程序的实例。另一方面,对于 UI 测试,每次都会加载一个专用的应用程序实例 - 并且可以使用 XCUIApplication().launchArguments 进行配置