ViewInspector 🕵️‍♂️ for SwiftUI

Platform codecov

ViewInspector 是一个用于单元测试 SwiftUI 视图的库。它允许在运行时遍历视图层级,并提供对底层 View 结构体的直接访问。

为什么?

SwiftUI 视图是状态的函数。我们可以为其提供输入,但无法验证输出……直到现在!

实用链接

使用场景

1. 搜索特定类型或条件的视图

使用 find 函数之一快速定位特定视图或断言不存在此类视图

try sut.inspect().find(button: "Back")

try sut.inspect().findAll(ViewType.Text.self,
                          where: { try $0.attributes().isBold() })

请查看指南中 此部分 以获取参考。

2. 读取标准视图的内部状态

标准 SwiftUI 视图不再是黑盒

let sut = Text("Completed by \(72.51, specifier: "%.1f")%").font(.caption)

let string = try sut.inspect().text().string(locale: Locale(identifier: "es"))
XCTAssertEqual(string, "Completado por 72,5%")

XCTAssertEqual(try sut.inspect().text().attributes().font(), .caption)

每个视图都有自己的一组可检查参数,您可以参考 API 覆盖范围 文档,查看特定 SwiftUI 视图可用的参数。

3. 验证您的自定义视图状态

获取您的自定义视图的副本,其中包含来自任何深度层级的实际状态和引用

let sut = try view.inspect().find(CustomView.self).actualView()
XCTAssertTrue(sut.viewModel.isUserLoggedIn)

该库可以处理各种类型的视图状态,例如 @Binding@State@ObservedObject@EnvironmentObject

4. 触发副作用

您可以通过编程方式触发系统控制回调来模拟用户交互

try sut.inspect().find(button: "Close").tap()

let list = try view.inspect().list()
try list[5].view(RowItemView.self).callOnAppear()

该库为编写带有回调的视图的异步测试提供了帮助工具。

常见问题

支持哪些视图和修饰符?

查看 API 覆盖范围

它是否使用了私有 API?

ViewInspector 使用官方 Swift 反射 API 来剖析视图结构。因此,即使您以某种方式将测试目标发布到生产环境,它也适用于生产环境。

如何将其添加到我的 Xcode 项目中?

确保您将框架添加到您的单元测试目标。不要将其添加到主构建目标。

Swift Package Manager

https://github.com/nalexn/ViewInspector

Carthage

github "nalexn/ViewInspector"

CocoaPods

pod 'ViewInspector'

如何在我的项目中使用它?

请参考 检查指南。您还可以查看我的另一个 项目,该项目利用 ViewInspector 来测试整个 UI。

贡献

欢迎贡献!如果您看到不支持的视图或修饰符,您可以提出 issue(以便我可以优先处理这些 SwiftUI API),或者尝试自行解决:使用 print("\(Inspector.print(<#view#>) as AnyObject)") 作为调查的起点。