SwiftUI 中的单元测试

use*_*265 7 xctest swift 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)
            }
        }
   }
}
}
Run Code Online (Sandbox Code Playgroud)

我开始写这样的测试

func testPage() {
    let page = Page().environmentObject(Service())
    let body = page.body
    XCTAssertNotNil(body, "Did not find body")
}
Run Code Online (Sandbox Code Playgroud)

但是,我如何获得身体内部的意见呢?我如何测试它们的属性?任何帮助表示赞赏。

更新:事实上,即使这样也行不通。我收到以下运行时异常

Thread 1: Fatal error: body() should not be called on  ModifiedContent<Page,_EnvironmentKeyWritingModifier<Optional<Service>>>.
Run Code Online (Sandbox Code Playgroud)

Jon*_*eid 6

更新:让我们都尝试使用 nalexn 的 ViewInspector 库!

原回复:

直到苹果

a) 将可测试性设计到 SwiftUI 中,以及

b) 向我们展示这种可测试性,

我们搞砸了,将不得不使用 UI 测试来代替单元测试……完全颠倒了测试金字塔。


nal*_*exn 5

有一个专门用于 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%")
Run Code Online (Sandbox Code Playgroud)

您的视图的测试可能如下所示:

func testPage() throws {
   let page = Page().environmentObject(Service())
   let string = try page.inspect().navigationView().scrollView().vStack().text(0).string()
   XCTAssertEqual(string, "Some text")
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是正确的答案。@nalexn 我已经看到这样的框架来来去去很多年了,但它们永远不会持久。然后,采用它们的人最终错误地构建了他们的软件。您不应该检查用户界面中的任何逻辑。反之亦然。您应该拥有一个支持将逻辑与 UI 分离的架构。然后你对其进行单元测试。单元测试最好的部分是它应该非常快。如果人们必须下载你的框架,然后运行 ​​UI 测试来测试应用程序,那么这将大大减慢开发速度。 (2认同)