2016-07-14 15 views
0

Ich bin ein Unit-Test-Neuling, ich teste, ob meine Schaltfläche zur Ansicht hinzugefügt wurde.Schaltfläche Unit Test zur Ansicht hinzugefügt

Mein erster Test bestanden richtig:

XCTAssertNotNil(vc.button, "button Not Initialised") 

Aber mein zweiter Test schlägt fehl, wenn ich die view.addSubview haben (Button) im Code

XCTAssertNotNil(vc.button.superview, "button Not added to view") 

Meine Frage ist, wie kann ich testen, Sehen Sie, ob die Schaltfläche zur Ansicht hinzugefügt wurde, ich verwende keine Storyboards, alles ist codiert. Weil der erste Test bestanden wird, unabhängig davon, ob ich addSubview im Code habe oder nicht.

Dank

In meinem Viewcontroller Klasse initialisiere ich die Taste:

private(set) lazy var myButton: UIButton = { 
    let myButton = UIButton(frame: CGRectZero) 
    return myButton 
}() 

und in viewDidLoad i fügen Sie es Einschränkungen SubView und geben:

view.addSubview(myButton) 

Meine Testfunktion ist:

func testAddRoomButtonInRoomsViewController() { 
    let vc = myViewController() 
    XCTAssertNotNil(vc.myButton, "Button Not Initialised") 
    XCTAssertNotNil(vc.myButton.superview, "Button Not Added To View") 
} 
+0

Könnten Sie ein vollständiges Codebeispiel hinterlassen bitte? – fiks

+0

Ja, könnten Sie den tatsächlichen Code teilen, den Sie testen möchten. – tanzolone

Antwort

1

Die viewDidLoad wird in Ihrem Testfall nicht aufgerufen, daher schlägt sie fehl. Sie müssen es manuell aufrufen.

1. eine Erweiterung einführen

extension UIViewController { 

     func startViewLifecycle() { 
      view.setNeedsLayout() 
      view.layoutIfNeeded() 
     } 
    } 

2. Nennen Sie es in Ihrem Testfall:

func testAddRoomButtonInRoomsViewController() { 
    let vc = myViewController() 
    vc.startViewLifecycle() 

    XCTAssertNotNil(vc.myButton, "Button Not Initialised") 
    XCTAssertNotNil(vc.myButton.superview, "Button Not Added To View") 
} 
+0

Danke, das hat perfekt funktioniert –

0

Es ist absolut zulässig, einen Test zu schreiben, um zu prüfen, ob eine Sicht einer Superview hinzugefügt wurde. Ich habe versucht, nur die folgende und es geht erfolgreich:

- (void)testView 
{ 
    UIView *superview = [UIView new]; 
    UIView *view = [UIView new]; 

    [superview addSubview:view]; 
    XCTAssertNotNil(view.superview); 
} 

Wenn Ihre Behauptung XCTAssertNotNil(vc.button.superview, "button Not added to view") versagt es entweder, weil Sie fügen Sie nicht die Subview der Superview (was wahrscheinlich ist, was Sie testen wollen), oder weil Ihr Superview wird freigegeben, bevor Sie Ihren Test abschließen können.

Wenn Letzteres müssen Sie sicherstellen, dass Sie einen starken Bezug auf die Superview halten, um Ihren Test durchzuführen - eine Superview behält einen starken Verweis auf jede seiner Untersichten, aber nicht umgekehrt (wie würde ein beibehalten erhalten Zyklus). So view.superview ist wirklich eine schwache Eigenschaft und es würde auf nil gesetzt werden, wenn/wenn die Superview freigegeben wird.

- (void)testView 
{ 
    UIView *superview = [UIView new]; 
    UIView *view = [UIView new]; 

    [superview addSubview:view]; 

    superview = nil; 

    XCTAssertNil(view.superview);//superview will be deallocated by now - this value is nil 
} 

Ich hoffe, das hilft.

// UPDATE:

auf dem Code der Suche ist es nun klar, dass man nicht addSubview: vor dem Test Aufruf wurde als die viewDidLoad nicht genannt wurde. @figs hat vorgeschlagen, dies zu umgehen.

+0

Hallo Danke für Ihre Antwort, ich habe mehr Code zu der ursprünglichen Frage hinzugefügt, da ich immer noch leicht verwirrt bin, was ich falsch mache: S –