如何为 Swift UI Toggle 正确编写 UI 测试

How to correctly write a UI test for a Swift UI Toggle

有谁知道如何为 Toggle 正确编写 UI 测试?即使在一个只有 Toggle 的全新项目中,整个 UI 中没有其他任何东西,我也会不断收到此类错误:

Failed to get matching snapshot: Multiple matching elements found for <XCUIElementQuery: 0x60000108c410>.
Sparse tree of matches:
→Application, pid: 26580, label: 'TestToggle'
 ↳Window (Main)
  ↳Other
   ↳Other
    ↳Other
     ↳Other
      ↳Switch, label: 'Test switch', value: 1
       ↳Switch, label: 'Test switch', value: 1

UI 看起来像这样:

struct ContentView: View {
  @State private var toggleValue = true
  var body: some View {
    Toggle("Test switch", isOn: $toggleValue)
      .padding()
  }
}

测试看起来像这样(这两行中的任何一行都给我同样的错误):

     func testExample() throws {
        let app = XCUIApplication()
        app.launch()
        
        XCTAssertTrue(app.switches["Test switch"].value as? String == "1")
//        XCTAssertTrue(app.switches["Test switch"].isEnabled)
    }

我肯定做错了什么。如果只有一个开关,怎么会出现两个? None 的在线文章似乎提到了我所看到的任何相关内容。任何帮助表示赞赏。谢谢:)

我在一些 Slack 频道中收到了一些回复,事实证明,出于某种原因,使用 Toggle 我不能依赖默认标签进行测试(与 Text 和 Button 不同),需要创建自定义辅助功能标识符.

所以只需添加如下内容:

    Toggle("Test switch", isOn: $toggleValue)
        .padding()
        .accessibilityIdentifier("testSwitch")

然后像这样测试有效:

func testExample() throws {
    let app = XCUIApplication()
    app.launch()
    XCTAssertTrue(app.switches["testSwitch"].isEnabled)
}

我不确定你为什么会收到你收到的错误,但你可以尝试将 accessibilityIdentifier 添加到 Toggle 并找到它。

例如:

struct ContentView: View {
  @State private var toggleValue = true
  var body: some View {
    Toggle("Test switch", isOn: $toggleValue)
      .padding()
      .accessibilityIdentifier("testSwitch")
  }
}

然后在您的测试中,您可以找到具有以下元素的元素:

func testExample() throws {
        let app = XCUIApplication()
        app.launch()
        
        XCTAssertTrue(app.switches["testSwitch"].value as? String == "1")
    }

顺便说一句,如果您想测试 Toggle 是打开还是关闭,您应该而不是使用isEnabled。这将检查“是否为用户交互启用了该元素。”

你应该使用

app.switches["testSwitch"].value as? String == "1" // on

app.switches["testSwitch"].value as? String == "0" // off

取决于你想测试什么。