2016-05-03 6 views
3

Wie schreibt man einen Testfall für dieses "Erfolg" -Szenario?Wie überschreibt TableView Delegate in XCTest

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

Ich habe versucht, durch den unten Mock Delegaten in schnellen Erstellung:

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() 
     } 
} 

Code:

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

Er druckt gleich Null. Dasselbe Modell, das ich für die Datenquelle ausprobiert habe und es gibt die Datenquelle obj zurück. Warum delegiere Nil zurück? und wie man dieses Szenario testet?

+0

Ist 'tblView.delegate' nicht null in der if? Wenn nicht-null, ist der Typ 'MockTableViewDelegate'? –

+0

nein es ist nur nil. –

+0

ist die Delivery-Eigenschaft des TblView über Storyboard oder Code? Die Zeit und der Kontext spielen eine wichtige Rolle in den Eigenschaften von Delegaten und Datenquellen. An welchem ​​Punkt wird der Testfall ausgeführt? – satheeshwaran

Antwort

0

Endlich fand ich, dass dies ein Fehler in der iOS-Laufzeit ist. Die einzige Möglichkeit, dieses Problem zu lösen, ist die Verwendung von OCMock, die jedoch nicht für Swift verfügbar ist. Also habe ich jetzt in Objective-c geschrieben.

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

Delegierte sind normalerweise schwache Referenzen. Wenn Sie Ihre MockTableViewDelegate zunächst einer lokalen Variablen zuweisen, sollte sie bei Verwendung in print noch aktiv sein. Versuchen Sie Folgendes:

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

Die vierte Zeile ist erforderlich, um das Objekt für die dritte Zeile leben zu halten.

+0

Versuchte kein Glück. Ich denke, das ist das Gleiche wie das, was ich gepostet habe. –

+0

Was ist der Typ von MockTableView? Wenn es nicht UITableView ist, dann haben Sie etwas mit der Eigenschaft delegate gemacht? –

+0

Dies könnte auch nicht die schwache Referenz enthalten, da Sie auch keinen delegate verwenden. Fügen Sie 'print (" delegate === \ (delegate) ")' am Ende hinzu. Wenn dies funktioniert, fügen Sie dem Testfall eine Delegate-Elementeigenschaft hinzu. –