SwiftUI 中的单元测试
Unit testing in SwiftUI
我正在尝试为 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>>>.
更新:让我们都尝试使用 nalexn 的 ViewInspector 库!
原回复:
直到苹果
a) 设计 Swift 的可测试性UI,以及
b) 向我们展示了这种可测试性,
我们被搞砸了,将不得不使用 UI 测试代替单元测试……在测试金字塔的完全倒置中。
有一个专门为 SwiftUI 视图的运行时检查和单元测试而创建的框架:ViewInspector
您可以提取自定义视图以验证内部状态、触发 UI 输入副作用、读取格式化文本值、确保应用正确的文本样式等等:
// Side effect from tapping on a button
try sut.inspect().find(button: "Close").tap()
let viewModel = try sut.inspect().view(CustomView.self).actualView().viewModel
XCTAssertFalse(viewModel.isDialogPresented)
// Testing localization + formatting
let sut = Text("Completed by \(72.51, specifier: "%.1f")%")
let string = try sut.inspect().text().string(locale: Locale(identifier: "es"))
XCTAssertEqual(string, "Completado por 72,5%")
您的视图测试可能如下所示:
func testPage() throws {
let page = Page().environmentObject(Service())
let string = try page.inspect().navigationView().scrollView().vStack().text(0).string()
XCTAssertEqual(string, "Some text")
}
我正在尝试为 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>>>.
更新:让我们都尝试使用 nalexn 的 ViewInspector 库!
原回复:
直到苹果
a) 设计 Swift 的可测试性UI,以及
b) 向我们展示了这种可测试性,
我们被搞砸了,将不得不使用 UI 测试代替单元测试……在测试金字塔的完全倒置中。
有一个专门为 SwiftUI 视图的运行时检查和单元测试而创建的框架:ViewInspector
您可以提取自定义视图以验证内部状态、触发 UI 输入副作用、读取格式化文本值、确保应用正确的文本样式等等:
// Side effect from tapping on a button
try sut.inspect().find(button: "Close").tap()
let viewModel = try sut.inspect().view(CustomView.self).actualView().viewModel
XCTAssertFalse(viewModel.isDialogPresented)
// Testing localization + formatting
let sut = Text("Completed by \(72.51, specifier: "%.1f")%")
let string = try sut.inspect().text().string(locale: Locale(identifier: "es"))
XCTAssertEqual(string, "Completado por 72,5%")
您的视图测试可能如下所示:
func testPage() throws {
let page = Page().environmentObject(Service())
let string = try page.inspect().navigationView().scrollView().vStack().text(0).string()
XCTAssertEqual(string, "Some text")
}