[SwiftUI] [UnitTest] テストの作り方 ( DisclosureGroup 編)

     
⌛️ < 1 min.
SwiftUI component UITest シリーズ DisclosureGroup 編

対象要素の取得

SwiftUI の DisclosureGroup は、accessibility ID を使って取得できます。

XCUIElementTypeQueryProvider からの取得には、buttons を使用します。

accessibility ID を使って取得


  let app = XCUIApplication()
  app.launch()

  let toggle = app.buttons["MyDisclosureGroup"]

状態のチェック

DiscloseGroup が開かれているかを、DisclosureGroup 自体から取得することはできませんでした。

当面の対策としては、Disclose 対象となっている要素を取得して exists/isHittable に該当するかどうかで判断することはできそうです。

操作

DisclosureGroup に対して、.onTap を指定すると、Disclose のトグル動作を行います。

テストコード

以下では、dg1 という accessibility ID を付与した DisclosureGroup に対して、tap 後で、Text が表示に切り替わっていることをテストしています。

DisclosureGroup テスト例


      // UI tests must launch the application that they test.
      let app = XCUIApplication()
      app.launch()
      
      // (1)
      let dcg1 = app.buttons["dcg1"] // get disclosure 

      // (2)
      var txt1 = app.staticTexts["txt1"] // get item in disclosure, but failed...

      // (3)
      dcg1.tap()
      // (4)
      XCTAssertTrue(txt1.isHittable)

コード解説
  1. DisclosureGroup を取得
  2. DisclosureGroup に含まれる要素を取得 (*1)
  3. DisclousreGroup を tap することで、open/close を制御
  4. DisclosureGroup に含まれている要素が表示されているかをテスト (*1)

現状、(2) は、期待通りに動作しません。accesibility(identifier:) で指定しても、DisclosureGroup に含まれる Text 要素を取得することはできませんでした。
ですので、(4) のテストも動作しません。

さらに調べたところ、DisclosureGroup に含まれる Text 要素が、DisclosureGroup と同じ identifier を持つことがわかりましたが、これが正しい動作とは思えません。

なお、表示されている状態でないと取得することはできませんでした。

まとめ:SwiftUI の DisclosureGroup をテストする

SwiftUI の DisclosureGroup をテストする
  • XCUIApplication から、accessibility ID 指定で DisclosureGroup を取得する
  • XCUIApplication から、buttons 経由で取得する
  • tap() で open/close 動作となる
  • DisclosureGroup に含まれている要素は、取得できない(Text が取得できないことを確認)
注意

ドキュメントがほとんどなく、手探りで書いてます。

結論としては、DisclosureGroup を UITest 対象にするには、時期尚早っぽいです。

調べた範囲では、上記のような状況でテストできそうもないのですが、ご存知の方、教えていただけると嬉しいです。

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です