2016-10-27 2 views
7

Wie kann ich innerhalb einer angle2 Runtime erkennen, dass ich im e2e Testmodus laufe? Ich habe ein Sitzungsaktualisierungsintervall, das ich im Testmodus nicht einrichten möchte, um Synchronisationsprobleme mit dem Winkelmesser zu vermeiden.Wie erkennt man die angular2 Webapplikation im Testmodus

Eine naheliegende Antwort wäre, nach einem URL-Parameter zu suchen. Gibt es eine weniger schmutzige Lösung?

EDIT (Erläuterung vor der Prämie): Der Winkelmesser ist so winklig (1 oder 2) verdrahtet, dass er auf alle ausstehenden Arbeiten wartet, bevor er etwas auswertet. Das bedeutet, dass alle herausragenden Winkel promises oder alle aktiven Winkel timer Winkelmessertests hängen (und schließlich dazu führen, dass sie ausfallen). Die am häufigsten vorgeschlagene Lösung besteht darin, browser.ignoreSynchronization = true zu setzen, aber das würde mich zwingen, entweder alle e2e-Tests in Callback-Ketten zu verschachteln oder eine Menge an Schlummern zu verwenden. Wahrscheinlich beides. So scheint es, dass ich zwischen einem Felsen und einem harten Platz festsitze, entweder eine echte bergauf Erfahrung, die e2e Tests schreibt oder eine Bedingung um eine bestimmte Linie des Anwendungscodes setzt, um nicht zu laufen, wenn im "Testmodus" (Ewh, hässlich). Ich wähle einen einfacheren e2e-Test, da ich davon ausgehe, dass ich sie zu Hunderten schreiben kann und bisher sprechen wir nur über ein Intervall, das während des Tests nicht kritisch ist (30-Minuten-Intervall für die Sitzungsaktualisierung).

+1

Das Holen der Umgebung von globalen Variablen (z.B. ENV) ist ziemlich häufig. – estus

+0

Ich verwende 'browser.ignoreSynchronization = true' mit Angular2 und muss nicht auf die Auflösung der Modelle nach einer Änderung warten. Können Sie ein Beispiel beschreiben, wenn "browser.ignoreSynchronization = true" ein Problem darstellt und Sie zum Einschlafen zwingt? –

+0

@JuanmiRodriguez Jedes Mal, wenn etwas Asynchrones getan wird. Zum Beispiel das Ändern der "Seite" oder das Abrufen von Daten über das Netzwerk. – Hampus

Antwort

1

Sie Ihre Timeouts/Intervalle außerhalb des winkelförmigen Stangen Zone durch

beginnen
ngZone.runOutsideAngular(() => { 
    // start your timeout/interval here 
}); 

Dies verhindert, dass der Winkelmesser auf das Ende des Timeouts/Intervalls wartet . Für weitere Informationen siehe: https://github.com/angular/protractor/issues/3349

0

eine offensichtliche Lösung, die ich denke, ist eine globale Variable auf Fensterobjekt Einstellung

if(window.TEST_MODE){ 
    // run code that needs to be run during test 
} 

In Ihrem Testcode gesetzt

window.TEST_MODE = true; 
+1

Während das funktionieren würde, ist es im Grunde nur eine dreckigere Lösung als das, was @estus mit Umgebungsvariablen vorgeschlagen hat, und das wird die Lösung sein, auf die ich hinarbeite. Haben Sie eine Konfigurationsvariable, sagen wir, 'useSessionRefresh = true' und haben Sie' false', wenn Sie die e2e-Testkonfiguration verwenden. Auch das wird den Produktionscode nicht mit einer Menge von window.TEST_MODE überladen und könnte möglicherweise eine wertvolle Konfiguration für sich sein. – Hampus

+0

Ich stimme zu, meine Lösung war nur vorübergehend, wenn Sie in Eile waren – Raaghu

Verwandte Themen