2016-05-03 12 views
3

この「成功」シナリオのテストケースを作成するにはどうすればよいですか?XCTestでテーブルビューデリゲートをオーバーライドする方法

if ([tblView.delegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)]) { 
     ... 
}else{ 
     ... 
} 

私は迅速に以下のモックデリゲートを作成することで試してみました:

class MockTableViewDelegate:NSObject, UITableViewDelegate { 

    @objc func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
      return 30 
     } 

     // MARK: Delegates 
    @objc func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
      return UIView() 
     } 
} 

コード:

mockTableView.delegate=MockTableViewDelegate() 
print("delegate===\(mockTableView.delegate)") 

それがnilを印刷します。同じ模擬私は、データソースをしようとしていると、それはデータソースobjを返しています。なぜデリゲートがnilを返すのですか?このシナリオをテストする方法は?

+0

if tblView.delegateはnilではありませんか? non-nilの場合、その型は 'MockTableViewDelegate'ですか? –

+0

は、そのnilだけです。 –

+0

は、ストーリーボードまたはコードを介して設定されたtblViewの代理プロパティですか?時間とコンテキストは、デリゲートとデータソースのプロパティで重要な役割を果たします。テストケースはいつ実行されますか? – satheeshwaran

答えて

0

最後に、これはiOSランタイムのバグだとわかりました。この問題を解決する1つの方法は、OCMockを使用することですが、Swiftでは利用できません。だから私は今Objective-cで書いています。

UITableView *tableView = [[UITableView alloc]init]; 
UIView *headerView = [UIView new]; 

id delegateProtocolMock = OCMProtocolMock(@protocol(UITableViewDelegate)); 
tableView.delegate=delegateProtocolMock; 
OCMStub([delegateProtocolMock tableView:tableView viewForHeaderInSection:0]).andReturn(headerView); 
1

代表者は、通常、弱い参照です。最初にMockTableViewDelegateをローカル変数に代入すると、printで使用されてもまだ有効になっています。以下を試してください:

let delegate = MockTableViewDelegate() 
mockTableView.delegate = delegate 
print("delegate===\(mockTableView.delegate)") 
print(delegate) 

3行目のオブジェクトを残しておくためには、4行目が必要です。

+0

運が良かった。私はこれが私が投稿したものと同じだと思います。 –

+0

mockTableViewのタイプは何ですか?それがUITableViewでない場合は、代理プロパティに何かをしましたか? –

+0

デリゲートを使用していないため、弱い参照が保持されないこともあります。 'print(" delegate === \(delegate) ")'を最下部に追加します。それが機能する場合は、デリゲートメンバプロパティをテストケースに追加します。 –

関連する問題