2016-04-10 18 views
3

UIViewにUIbuttonをテストしたいのですが、適切なハンドラがあります。指定したイベントが発生したときに、対象物に対して実行されるアクションを返しactionForTragetアップルによるとUIButtonの確認方法にはターゲットがありますか?

NSArray *actions = [loginVC.registerBtn actionsForTarget:target forControlEvent:UIControlEventTouchUpInside]; 

:私が見てきた

一つの方法です。

しかし、私が見た他の方法は、ループを有するallTargetsをチェックしている:

for (id target in loginVC.registerBtn.allTargets) { 
     NSArray *actions = [loginVC.registerBtn actionsForTarget:target forControlEvent:UIControlEventTouchUpInside]; 
     XCTAssertEqual(actions.count, 1); 
     SEL handler = NSSelectorFromString(actions[0]); 
     XCTAssertTrue([loginVC respondsToSelector:handler]); 
    } 

リンゴの文献によれば:

allTargets:コントロールに関連付けられているすべてのターゲットオブジェクトを返します。

ループを持たないという違いは何ですか?いつループする必要があり、actionForTargetを取得する必要があるのですか?

NSArray *actions = [loginVC.registerBtn actionsForTarget:target forControlEvent:UIControlEventTouchUpInside]; 
XCTAssertTrue([actions containsObject:@"onRegisterButtonPressed:"]); 

のベストプラクティスは何ですか:私の質問の

第二部は、我々のボタンは、ターゲットを持っているか、また、次のようにアクションを実行するために接続されている方法をチェックチェックする必要があるだけでしょうか?

開発者がUIButtonのアクションを処理するために異なるメソッドを変更した場合、テストで変更する必要がありますか、テストを失敗させてテストを更新する必要がありますか?

+0

[ThunderCats](https://github.com/metova/ThunderCats/blob/master/Categories/UIControl%2BTCAdditions.h)にはそのための方法があります。 – nhgrif

答えて

5

すべてのターゲットのすべてのアクションをチェックする場合は、allTargetsというループを使用します。

知られている単一のターゲットに対してのみアクションを実行する場合は、ループを使用せず、actionsForTarget:forControlEvent:を使用します。

質問の2番目の部分については、あなたが確認するものはあなた次第です。誰もあなたのためにそれに答えることはできません。イベントに少なくとも1つのアクションがあることを確認する必要がある場合は、actions.countが1つ以上であることを確認してください。

アクションがあることを確認し、アクションに特定の名前が付いていることを確認する必要がある場合は、投稿したコードが必要なものです。