Test, wenn performSegueWithIdentifier innerhalb einer View-Controller-Methode aufgerufen wird

8

Ich gehe eine Anwendung durch und füge Unit Tests hinzu. Die Anwendung wird mit Storyboards geschrieben und unterstützt iOS 6.1 und höher.

Ich konnte alle üblichen Rückgabemethoden problemlos testen. Allerdings bin ich momentan mit einem bestimmten Test, den ich durchführen möchte, nicht zufrieden:

Im Wesentlichen habe ich eine Methode, lasst es doLogin nennen:

%Vor%

Ich möchte also testen, ob entweder der Abschnitt aufgerufen wird und ob die Variable gesetzt ist oder ob der Viewable-Controller MemorableWord geladen ist und die darin enthaltenen Variablen korrekt sind. Die hier in der doLogin-Methode festgelegte Variable wird in der prepareForSegue-Methode an den Ziel-View-Controller des memoryWord-Segments übergeben.

Ich habe OCMock eingerichtet und arbeite, und ich benutze auch XCTest als mein Unit-Testframework. Ist jemand in der Lage gewesen, einen Komponententest zu produzieren, um eine solche Situation abzudecken?

Es scheint so, dass Google und SO in Bezug auf Informationen rund um diesen Bereich ziemlich leer sind. Es gibt viele Beispiele für einfache grundlegende Tests, die für die komplexere Realität des iOS-Testens ziemlich irrelevant sind.

    
Rob 16.12.2013, 11:01
quelle

4 Antworten

4

Sie sind auf dem richtigen Weg, Ihr Test möchte das überprüfen:

  1. Wenn der Login-Button angetippt wird, wird doLogin mit dem loginButton als Absender
  2. aufgerufen
  3. Wenn einige Kriterien JA sind, rufen Sie performSegue
  4. auf

Sie sollten also den vollen Ablauf vom Login-Button bis zur Ausführung startenSegue:

%Vor%

Sie müssen eine Eigenschaft für "Kriterien" implementieren, damit es einen Getter gibt, den Sie mit 'expect' verspotten können.

Es ist wichtig zu erkennen, dass "erwarten" nur einen Aufruf an den Getter ausspioniert, nachfolgende Aufrufe werden mit "Unerwartete Methode aufgerufen ..." fehlschlagen. Sie können "stub" verwenden, um sich über alle Anrufe lustig zu machen, aber das bedeutet, dass immer derselbe Wert zurückgegeben wird.

    
ImHuntingWabbits 26.12.2013, 06:55
quelle
2

IMHO scheint dies ein Testszenario zu sein, für das not properly eingerichtet wurde.

Bei Unit-Tests sollten Sie nur test units (z. B. einzelne Methoden) Ihrer Anwendung verwenden. Diese Einheiten sollten independent von allen anderen Teilen Ihrer Anwendung sein. Dies garantiert Ihnen, dass eine einzelne Funktion ordnungsgemäß ohne Nebenwirkungen getestet wird. Übrigens: OCMock ist ein großartiges Werkzeug, um alle Teile, die Sie nicht testen wollen, auszuspionieren und somit Nebenwirkungen zu erzeugen.

Im Allgemeinen scheint Ihr Test eher wie ein Integrationstest

zu sein

IT is the phase of software testing, in which individual software modules are combined and tested as a group .

Was würde ich in Ihrem Fall tun?

Ich würde entweder einen Integrationstest definieren, bei dem ich alle Teile meiner Ansicht richtig testen würde und deshalb indirekt meine View-Controller testen würde. Sehen Sie sich ein gutes Test-Framework für diese Art von Szenario an - KIF

Oder ich würde Einzel-Unit-Tests für die Methode "doLogin" sowie die Methode zur Berechnung der Kriterien in Ihrer if-Anweisung durchführen. Alle Abhängigkeiten sollten gemunkelt werden, was bedeutet, dass Sie innerhalb Ihres doLogin-Tests sogar die Kriterienmethode vortäuschen sollten ...

    
Alexander 16.12.2013 11:29
quelle
2

Der einzige Weg, den ich sehen kann, um dies zu testen, ist die Verwendung von partiellen Mocks:

%Vor%

Natürlich ist dies nur ein Beispiel für den Test und ist nicht wirklich der Test, den ich ausführe, sondern hoffentlich zeigt, wie ich diese Methode in meinem View-Controller testen muss. Wie Sie sehen können, wird, wenn% code_% nicht aufgerufen wird, die Überprüfung mit der Ursache fehlgeschlagen.

    
Rob 16.12.2013 12:39
quelle
1

Gib OCMock eine Lektüre, ich habe gerade ein Buch von Amazon über Unit Testing iOS gekauft und es ist wirklich gut zu lesen. Auf der Suche nach einem TDD-Buch auch.

    
Tom 04.09.2014 15:53
quelle