【发布时间】:2020-02-02 21:24:12
【问题描述】:
我正在尝试为 SwiftUI 视图编写单元测试,但在网上找到了零资源来了解如何去做。
我的观点如下
struct Page: View {
@EnvironmentObject var service: Service
var body: some View {
NavigationView {
ScrollView(.vertical) {
VStack {
Text("Some text"))
.font(.body)
.navigationBarTitle(Text("Title")))
Spacer(minLength: 100)
}
}
}
}
}
我开始写这样的测试
func testPage() {
let page = Page().environmentObject(Service())
let body = page.body
XCTAssertNotNil(body, "Did not find body")
}
但是我如何获得身体内部的视图呢?我如何测试它们的属性?任何帮助表示赞赏。
更新: 事实上,即使这样也行不通。我收到以下运行时异常
Thread 1: Fatal error: body() should not be called on ModifiedContent<Page,_EnvironmentKeyWritingModifier<Optional<Service>>>.
【问题讨论】:
-
我真的不认为 SwiftUI 被设计为像那样进行单元测试。我会使用 UI 测试来测试 UI。
-
在测试 UI 时,e2e/集成几乎总是优先于单元测试。当您尝试编写单元测试时,您实际上最终会测试 UI 库本身,或者您最终会在测试中复制实际代码。我的东西是可测试的,它通常可以从 UI 中移除到业务层并单独测试。 Swift UI 定义了布局。尝试对 Swift UI 进行单元测试就像尝试对 xib 或 CSS 文件进行单元测试。您可以做的最好的 uni 测试是快照测试。
-
快照非常适合布局,但 SwiftUI 是布局 + 行为。