2017-05-17 10 views
1

ストーリーボードのテーブルビューのプロパティセルにShowセグを添付します。今私はこのバインディングが存在するかどうかテストしたい。つまり、Interface Builderでセグを削除したり、セグの識別子を変更したりすると、落ちるテストが必要になります。ストーリーボードに接続されたセグをテストする方法

ユーザーの観点からは、ユーザーはテーブルビューのセルをタップしてからこのセグを実行する必要があります。

テストの観点からは、私はprepare(for:sender:)メソッドを使ってセグの実行を確認することができますが、プログラムで「タップ」をトリガーする方法はわかりません。

私はtableView.selectRow(at:animated:scrollPosition)cell.setSelected(_:animated:)を試しましたが、どちらもうまくいきませんでした。

  1. InterfaceBuilder経由で追加されたセグをプログラムでトリガーする方法はありますか?
  2. また、このセグのバインディングをテストする他の方法はありますか?
  3. さらに明確にするため

更新

私はプログラムでセグエをトリガーする方法を知っている - ので、それはここで求められているものではありません。

ストーリーボードでシーンの後ろにトリガー作業が行われ、制作コードにセグのトリガーコードがありません(オーバーライドされたのはprepare(for:sender:)のみです)。そして、アプリケーションは意図どおりに動作します。ここで問題となるのは、私はこの事実を裏返しにするトリガーが常に存在することを保証するためのテストが必要です。いつか私は酔っ払ってストーリーボードを編集して元のセグを無関係な場所に接続すると、赤いと私のお尻で私を蹴る。

+0

'performSegue'はイエス – user1046037

+0

プログラムでセグエを行うだろうが、私がテストしたい事は、細胞上のタップが引き金となり」です「セグがトリガされたときに何が起こるか」ではなく、「セグ」と表示されます。 –

+2

UIテスト - https://developer.apple。 – user1046037

答えて

-1

ちょうどこのFUNCを使用します。
[self performSegueWithIdentifier:@"YOURIDENTIFIER" sender:self]; それはあなたがあなたのセグエをテストするに役立つことがあります。

+0

「私はInterface BuilderでSegueを削除するか、またはInterface BuilderでSegueを削除した場合に落ちるテストが必要です。 segueビヘイビアの存在を確認していません。 –

+0

これは正しい方法です。このメソッドは、指定された識別子のセグが存在しない場合、例外処理をスローします。 – user1046037

+0

正しい識別子のセグがあっても、関連性のないUI要素に接続されていた場合はどうなりますか?この関数の呼び出しは失敗しません –

0

あなたがこれを行う試すことができます。

func handleTap(gesture: UITapGestureRecognizer) { 
    performSegueWithIdentifier("yourSegue", sender: self) 
} 

2-あなたのセルにジェスチャーを追加::

let tap = UITapGestureRecognizer(target: self, action:#selector(handleTap(_:))) 
yourcell.addGestureRecognizer(tap) 
+0

私はあなたの意見を得るが、それは何とか無関係な答えです。今のところ、このセグのトリガは、ストーリーボード(セルからデスティネーションビューコントローラへのコントロールクリック)によって処理され、意図したとおりに動作します。私はそのセグを引き起こすためのプロダクションコードを追加する必要はありません。私がここで求めているのは、ストーリーボードが誤って誤って編集され、コントロールがクリックされたものが削除されたときに、この誤編集をキャッチするテストが必要な場合です。 –

0

私がすることができた

1 - あなたはセグエで関数を作成する必要がありますテーブルビューセルの代わりにビューコントローラに接続されているセグをテストします。

アプリでは、セルがタップされたときにセグを実行します。これは、セグを表ビューのセルに接続した場合とほぼ同じです。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    performSegue(withIdentifier: "showNextView", sender: nil) 
} 

これは、次のようにセグエをテストすることができます:

func testSegue() { 

    let appDelegate = UIApplication.shared.delegate as! AppDelegate 

    // create the view controller that has the segue to be tested 
    let viewController = appDelegate.window?.rootViewController?.storyboard?.instantiateViewController(withIdentifier: "TableViewController") as! TableViewController 

    // assuming the view controller does a Show segue, put it in a navigation controller 
    let navigationController = UINavigationController(rootViewController: viewController) 

    // this is needed or test fails! 
    navigationController.view.layoutIfNeeded() 

    // replace the root view controller with the navigation controller 
    appDelegate.window!.rootViewController = navigationController 

    // finally, select the row! this fires the segue 
    viewController.tableView(viewController.tableView, didSelectRowAt: IndexPath(row: 0, section: 0)) 

    // assert something about the result of the segue 
    XCTAssertTrue(navigationController.visibleViewController is SeguedViewController) 
} 
関連する問題