2016-11-01 4 views
1

Ich entwickle eine Angular-App, die lange Abfragen verwendet, um schnelle Aktualisierungen zu erhalten, wenn sich auf dem Server etwas ändert. Ich benutze $ Ressource wie dies die tatsächlichen Daten zu holen:Testen von Anwendungen, die lange Abfragen mit Winkelmesser verwenden

appServices.factory('Data', ['$resource', 
    function(){ 
    return $resource('', {}, { 
     query: {"url": …, isArray: false} 
    }); 
}]); 

Dann habe ich eine Dienstleistung, die Pflege der Lang-Abfrage dauert: Warten, dass die Daten geladen werden; Speichere sie irgendwo; Starten Sie nach einer Sekunde den nächsten langen Abfragezyklus:

app.factory(„DataLoader“, [„Data“, "$timeout", function(Data, $timeout) { 
    return { 
      loadData: function() { 
       var parent = this; 
       var data = Data.query({}, 
         function(result) { 
          /* do something to the data, 
          * then start waiting for an update from the server again 
          */ 
          $timeout(function() { 
           parent.loadData(); 
          }, 1000); 
         } 
       ); 
      } 
    }; 
}); 

Es funktioniert wie ein Charme bisher.

Allerdings versuche ich jetzt, Winkelmesser Tests dafür zu schreiben. Das Problem ist: Der Server unterbricht die langen Abfrageanforderungen nach 30 Sekunden nur dann, wenn keine Änderungen an den Daten vorgenommen werden. Während ich auf neue Daten innerhalb des $ -Zeitlimits warte, wird das Zeitlimit überschritten, bevor irgendwelche Ergebnisse eintreffen.

Ich habe die letzte Stunde gegoogelt, aber es scheint keine Lösung zu geben, außer $ interval anstelle von $ timeout zu verwenden. Dies funktioniert in einem guten alten Polling-Setup (Abfrage alle 3 Sekunden, leere Ergebnisse vom Server, wenn es nichts Neues gibt). Um genau das zu vermeiden, habe ich lange Abfragen implementiert. $ Timeout ist nur die viel sinnvollere Option für mich.

Können Sie mir irgendwelche Tipps geben, wie man den Winkelmesser in dieser Umgebung erfolgreich laufen lässt?

+1

Wenn Sie nicht '$ interval' verwenden wollen, dann _think_ Ihre einzige andere Option wäre die Deaktivierung der Synchronisation von Winkelmessern mit Angular. 'browser.ignoreSynchronization = true'; Nicht sicher, ob es eine andere Option gibt – Gunderson

+0

Danke für den Hinweis, @Gunderson! Ich habe genau das getan und dann manuell gewartet, bis DOM-Elemente mit den erwarteten Bedingungen angezeigt werden. – fjc

Antwort

0

Ich würde vorschlagen, einen Blick auf Protractor's documentation on timeouts. Sie müssen wahrscheinlich Ihre allScriptsTimeout in Ihrer Konfigurationsdatei erhöhen, da die Standardzeit für die Seitensynchronisierung 11 Sekunden beträgt.

+0

Dachte darüber auch, nur Problem ist, dass dann die Testausführung unglaublich viel Zeit in Anspruch nimmt. – fjc

Verwandte Themen