首页 > 解决方案 > 如何对@ViewBuilder 函数进行单元测试?

问题描述

一个示例函数:

@ViewBuilder func returnView() -> some View {
        if thisIsTrue == true {
            SomeView()
        } else {
            AnotherView()
        }
    }

我试过这样的测试:

let testView = sut.returnView()
XCTAssert(testView is SomeView)

当只有一种可能的视图类型时它会通过,但一旦有选择就会失败。

关于如何对这个函数的输出进行单元测试有什么建议吗?

标签: swiftuitddviewbuilder

解决方案


不透明的返回类型some View意味着这个函数总是在函数的所有路径上只返回一种类型,并且该类型View符合尊重真正的返回类型。如果你想知道 opaque 类型到底是什么,你可以让编译器告诉你。例如这里是一个游乐场。请注意,此解决方案很脆弱,因为更改函数的实现很可能会更改返回类型。

import SwiftUI

struct SomeView: View {
  var body: some View { EmptyView() }
}

struct AnotherView: View {
  var body: some View { Color.red}
}

@ViewBuilder func returnView() -> some View {
  if true {
    SomeView()
  } else {
    AnotherView()
  }
}

let a = returnView()

print(type(of: a))

输出:

_ConditionalContent<SomeView, AnotherView>

推荐阅读