🕵️♂️ for SwiftUI
ViewInspector
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()
此库提供助手以编写带有回调的视图的异步测试。
常见问题解答(FAQs)
支持哪些视图和修改器?
查看API 覆盖率。目前对 SwiftUI v1 API 几乎完全支持,v2 和 v3 的支持正在活跃开发中。
是否使用私有 API?
ViewInspector 使用官方的 Swift 反射 API 来剖析视图结构。因此,即使你能够以某种方式将测试目标传递到生产环境中,它也会是生产友好的。
我如何将此添加到我的 Xcode 项目中?
请确保将框架添加到您的单元测试目标中。请不要将其添加到主构建目标。
Swift包管理器
https://github.com/nalexn/ViewInspector
Carthage
github "nalexn/ViewInspector"
CocoaPods
pod 'ViewInspector'
如何在项目中使用它?
请参阅检查指南。您还可以查看我其他使用ViewInspector进行完整UI测试的项目https://github.com/nalexn/clean-architecture-swiftui。
其他问题、顾虑或建议?
请在Twitter上联系我,或者在Github上提交问题或拉取请求。