2015-11-23 8 views

答えて

23

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

しかし、あなたのテストについて少し違って考えると、非常に似たような主張ができます。 あなたがユーザーであるかのようにテストを書く。あなたはItemDetailViewControllerまたはItemListTableViewControllerを見ているかどうか気にしないので、あなたのテストはどちらにもなりません。

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

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

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) 
+0

ありがとう、これは多くの助けになります。私は自分自身で正確なことをしたが、私は何かが欠けていると思っていた。 –

+1

私の場合は、app.buttons ["View Item"]。tap() 'の前に' sleep(1) 'しなければなりません。 – onmyway133

+4

これを行うにはもっと良い方法があるはずです...アプリでテキストを変更するとどうなりますか?アプリケーションに複数のテキストのローカライズがあるとどうなりますか?ローカライズされていればかなりのテストが必要になり、テキストを変更する必要がある場合はメンテナンスの可能性があります。 –

関連する問題