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

Mic*_*ovo 7 ios xctest swiftui

有谁知道如何正确编写 Toggle 的 UI 测试?即使在一个全新的项目中,整个 UI 中只有一个切换而没有其他内容,我仍然会收到此类错误:

\n
Failed to get matching snapshot: Multiple matching elements found for <XCUIElementQuery: 0x60000108c410>.\nSparse tree of matches:\n\xe2\x86\x92Application, pid: 26580, label: 'TestToggle'\n \xe2\x86\xb3Window (Main)\n  \xe2\x86\xb3Other\n   \xe2\x86\xb3Other\n    \xe2\x86\xb3Other\n     \xe2\x86\xb3Other\n      \xe2\x86\xb3Switch, label: 'Test switch', value: 1\n       \xe2\x86\xb3Switch, label: 'Test switch', value: 1\n
Run Code Online (Sandbox Code Playgroud)\n

用户界面如下所示:

\n
struct ContentView: View {\n  @State private var toggleValue = true\n  var body: some View {\n    Toggle("Test switch", isOn: $toggleValue)\n      .padding()\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
     func testExample() throws {\n        let app = XCUIApplication()\n        app.launch()\n        \n        XCTAssertTrue(app.switches["Test switch"].value as? String == "1")\n//        XCTAssertTrue(app.switches["Test switch"].isEnabled)\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

我\xe2\x80\x99m肯定做错了什么。如果 \xe2\x80\x99s 只有一个开关,怎么会出现两个开关呢?我见过的网上文章似乎都没有提到任何与此相关的内容。任何帮助表示赞赏。谢谢 :)

\n

Mic*_*ovo 9

我在一些松弛通道中得到了一些回复,事实证明,由于某种原因,使用切换时我不能依赖默认标签进行测试(与文本和按钮不同),并且需要创建自定义辅助功能标识符。

所以只需添加这样的内容:

    Toggle("Test switch", isOn: $toggleValue)
        .padding()
        .accessibilityIdentifier("testSwitch")
Run Code Online (Sandbox Code Playgroud)

然后像这样进行测试:

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

  • 我不确定您的测试是否断言您想要测试的内容。`isEnabled` 返回“该元素是否启用了用户交互”。如果用户可以与其交互,即使切换已关闭,“isEnabled”也会返回“true”。 (2认同)