ViewInspector 是一个用于单元测试 SwiftUI 视图的库。它允许在运行时遍历视图层级,并提供对底层 View
结构体的直接访问。
SwiftUI 视图是状态的函数。我们可以为其提供输入,但无法验证输出……直到现在!
使用 find
函数之一快速定位特定视图或断言不存在此类视图
try sut.inspect().find(button: "Back")
try sut.inspect().findAll(ViewType.Text.self,
where: { try $0.attributes().isBold() })
请查看指南中 此部分 以获取参考。
标准 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 视图可用的参数。
获取您的自定义视图的副本,其中包含来自任何深度层级的实际状态和引用
let sut = try view.inspect().find(CustomView.self).actualView()
XCTAssertTrue(sut.viewModel.isUserLoggedIn)
该库可以处理各种类型的视图状态,例如 @Binding
、@State
、@ObservedObject
和 @EnvironmentObject
。
您可以通过编程方式触发系统控制回调来模拟用户交互
try sut.inspect().find(button: "Close").tap()
let list = try view.inspect().list()
try list[5].view(RowItemView.self).callOnAppear()
该库为编写带有回调的视图的异步测试提供了帮助工具。
查看 API 覆盖范围。
ViewInspector 使用官方 Swift 反射 API 来剖析视图结构。因此,即使您以某种方式将测试目标发布到生产环境,它也适用于生产环境。
确保您将框架添加到您的单元测试目标。不要将其添加到主构建目标。
https://github.com/nalexn/ViewInspector
github "nalexn/ViewInspector"
pod 'ViewInspector'
请参考 检查指南。您还可以查看我的另一个 项目,该项目利用 ViewInspector 来测试整个 UI。
欢迎贡献!如果您看到不支持的视图或修饰符,您可以提出 issue(以便我可以优先处理这些 SwiftUI API),或者尝试自行解决:使用 print("\(Inspector.print(<#view#>) as AnyObject)")
作为调查的起点。