web-dev-qa-db-ja.com

UITesting、XCTest現在のViewControllerクラス

単純な問題。次のビューコントローラーにセグエを実行するボタンを取得しました。 UI XCTestを記述して、必要なビューコントローラーを開いたことを伝えたいと思います。

18
Dejan Zuza

UIテストフレームワークは、アプリケーションコードにアクセスできないため、インスタンスでのクラスアサーションが不可能になります。画面上にあるコントローラのクラスを直接通知することはできません。

ただし、テストについて少し異なる方法で考える場合は、非常に類似したアサーションを作成できます。 自分がユーザーであるかのようにテストを記述します。ユーザーはItemDetailViewControllerItemListTableViewControllerのどちらを見ていても気にしないので、テストも必要ありません。 。

ユーザーは画面の内容を気にします。タイトルは?または、これらのボタンの名前は何ですか?そのロジックに従って、コード化されたクラスの名前ではなく、それらの項目に基づいてアサートするようにテストを書き直します。

たとえば、コントローラーをナビゲーションスタックで提示している場合は、タイトルをアサートできます。

let app = XCUIApplication()
app.buttons["View Item"].tap()

XCTAssert(app.navigationBars["Some Item"].exists)

または、画面がモーダルで表示されているが、静的なテキストまたはボタンがわかっている場合は、それらを使用します。

let app = XCUIApplication()
app.buttons["View Item"].tap()

XCTAssert(app.staticTexts["Item Detail"].exists)
XCTAssert(app.buttons["Remove Item"].exists)
37
Joe Masilotti

マットグリーンのコメントは私に良い考えを与えました。未使用のラベル/ボタンを定義することができます。理想的には、ベースビューコントローラー内にあり、表示されるビューコントローラーを見つけるためのクエリを実行するためのアクセシビリティラベルを割り当てます。

public class BaseViewController: UIViewController {

    let button = UIButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1))

    public override func viewDidLoad() {
        super.viewDidLoad()
        if let identifier = self.theClassName.split(separator: ".").last {
            button.accessibilityIdentifier = String(identifier)
            view.addSubview(button)
        }
    }
}

public class DatePickerViewController: BaseViewController {
   ...
}

func testExample() {
    let app = XCUIApplication()
    app.launch()
    app.navigationBars.buttons["DateSelector"].tap()
    XCTAssertTrue(app.buttons["DatePickerViewController"].exists)
}

このアプローチを機能させるには、ビューコントローラーを識別するために使用するビュー(この場合はボタン)をサブビューとして追加する必要があり、ゼロ以外のフレームが必要であることに注意してください。

0
Olcay Ertaş