Funktionsprüfung in Swift. Simulieren Sie den Anwendungsablauf

8

Ich versuche, in Swift einige wirklich einfache Funktionen / Funktionstests durchzuführen, aber ich habe einige Zweifel, die ich lösen muss, um nützliche Tests erstellen zu können.

Ich möchte überprüfen, ob ein von einem anderen Controller vorgestellter Controller in der Anwendungsnavigationshierarchie vorhanden ist (es spielt keine Rolle, ob der Controller einem NavigationController, Modal oder was auch immer präsentiert wurde).

Wenn ich Controller programmgesteuert instanziiere und direkt in die Testfunktionen zeige, bekomme ich beim Überprüfen des On Top Controllers immer den Storyboard Root-Controller anstelle des Controllers Ich habe gerade instanziiert, als ob die Controller, die ich manuell erstellt habe, nie in die Anwendungshierarchie aufgenommen wurden.

Hier ein Beispiel für Pseudocode:

%Vor%     
MatterGoal 07.12.2014, 20:46
quelle

3 Antworten

5
  

Wenn ich Controller programmatisch instanziiere und zeige, direkt in die Testfunktionen, wenn ich den On-Top-Controller überprüfe, bekomme ich immer den Storyboard-Root-Controller anstelle des Controllers, den ich gerade instanziiert habe, als ob die Controller manuell wären erstellt werden niemals zur Anwendungshierarchie hinzugefügt.

Aus dem Code, den Sie geschrieben haben, überprüfen Sie nicht den On-Top-Controller, sondern den Root-View-Controller selbst (der alle View-Controller in der Hierarchie einschließlich Navigations-Controller enthält), weshalb Sie immer Storyboard-Root-View-Controller zurückbekommen. Um die meisten Controller vom View-Controller zu bekommen, können Sie die folgende rekursive Funktion verwenden, die den Root-View-Controller übernimmt und seinen obersten Controller zurückgibt

%Vor%

und überprüfen Sie dann in Ihrer Testfunktion den Controller, den diese Funktion zurückgibt

%Vor%     
Zell B. 20.02.2015 15:18
quelle
0

Zuerst haben Sie gesagt, dass es egal ist, ob die Ansicht von einem Navigationscontroller präsentiert wird. Also habe ich eine leere Anwendung mit einem Navigationscontroller als ersten Controller und zwei ViewControllern erstellt, der erste ist nur namens ViewController der zweite ist in meinem Fall ViewControllerSecond , was dein TheExpectedClass Controller ist.

Als erstes: Wenn Sie einen NavigationController verwenden, ist der rootController natürlich immer der navigationController. Also schauen wir uns an, was passiert, wenn wir zuerst ViewController laden und dann ViewControllerSecond :

drücken %Vor%

Sie werden sehen, dass ViewControllerSecond wie erwartet an den navigationController übergeben wurde.

    
Alex 20.02.2015 10:11
quelle
0
  

Wenn ich Controller programmgesteuert instanziiere und zeige, direkt in   Der Test funktioniert, wenn ich den On Top Controller überprüfe bekomme ich immer   den Storyboard-Root-Controller anstelle des Controllers, den ich habe   nur instanziiert, als ob die Controller, die ich manuell erstellt habe   werden niemals in die Anwendungshierarchie eingefügt.

Was Sie hier sagen, ist wahr, sie werden nicht hinzugefügt. In Ihrem Pseudocode haben Sie lediglich ein paar View-Controller instanziiert und aneinander gefügt.

Warum erwarten Sie, dass sie sich in der Anwendungshierarchie befinden? Sie haben sie dort nie hinzugefügt.

Hier gibt es zwei Probleme, und das ist nur der erste.

Das zweite Problem:

UIApplication.sharedApplication().keyWindow?.rootViewController

Dieser Code packt den Root-View-Controller, der eigentlich auf der "Unterseite" liegt (unter der Annahme, dass "oben" besser sichtbar ist). Wenn Sie ein Storyboard verwenden, ist dies fast immer der anfängliche View-Controller.

Selbst wenn Sie Ihre neu instanziierten View-Controller zur Hierarchie hinzugefügt haben, wird der Test, den Sie ausführen, trotzdem nicht bestanden.

Lösungsvorschlag

Als einfachen Test müssen Sie nicht testen, ob sich Ihr neuer View Controller an der Spitze der visuellen Hierarchie befindet. Um dies zu tun, müssten Sie es dort hinzufügen.

Alles, was Sie wirklich testen müssen, ist - "Wenn ich meinen View-Controller auf diesen neu erstellten Navigationsstapel schiebe, sollte er an der Spitze dieses Stapels (sichtbar) sein"

Auf diese Weise ist Ihr Test nicht vom Anwendungsstatus oder anderen Controllern in der Hierarchie abhängig.

Pseudocode:

%Vor%     
Jack 20.02.2015 16:22
quelle