2014-01-11 6 views
21

Ich versuche, eine e2e-Test-Suite in eckigen einzurichten, und müssen vordefinierte Antworten mit $ httpBackend zurückgeben. Es wäre schön, wenn ich einfach einen Dateiinhalt, z.

$httpBackend.whenPOST('/phones').respond(function(method, url, data) { 
    return getContentOf("/somefile"); 
    }); 

Ich versuchte $ http, etwas entlang der Linien von

$httpBackend.whenPOST('/phones').respond(function(method, url, data) { 
    return $http.get("/responses/phones.js"); 
    }); 

aber es hat nicht funktioniert, denke Winkel nicht unterstützt Rückkehr Versprechen von $ httpBackend zu benutzen?

Eine Möglichkeit, wie ich js-Dateien mit Antworten zum App-Laden referenzieren und den Inhalt von Dateien Variablen zuweisen kann, aber es wäre viel schöner, Daten bei Bedarf laden zu können.

+0

Das hat mir geholfen: http://Stackoverflow.com/a/18523642/2539811 –

Antwort

0

$ httpBackend.whenPost gibt ein requestHandler-Objekt zurück.

Nach der offiziellen docs:

requestHandler (ist) ein Objekt mit respond Methode, die steuert, wie ein angepaßtes Anforderung behandelt wird.

  • respond -
    {function([status,] data[, headers, statusText]) | function(function(method, url, data, headers)}
    - Die respond Methode nimmt einen Satz von statischen Daten zurückgegeben oder eine Funktion sein, die ein Array mit Antwortstatus (number) zurückkehren können, Antwortdaten (string), Antwort-Header (Objekt) und der Text für den Status (Zeichenfolge).

Quelle:Angular Documentations

Die respond Methode einen Satz von statischen Daten nimmt zurückgeführt werden oder eine Funktion, die ein Array mit Antwortstatus zurückkehren kann (Zahl), werden Antwortdaten (string) und Antwortheader (Object).

So werden Sie, so etwas zu tun haben:

var response = 'content of somefile.js'; 
// OR var response = { foo : "bar" }; 
// OR var response = (actually consume content of somefile.js and set to response) 

$httpBackend.whenPost('/phones').respond(response); 
+3

Duh .. Ja, ich verstehe. Meine Frage war, wie dieser Dateiinhalt abgerufen werden kann. – Evgeni

+0

Ich glaube nicht, dass Sie es bei Bedarf tun können. Warum müssen Sie den Inhalt der Datei abrufen? Kannst du es nicht einfach mit einem falschen Gegenstand verhöhnen? Wenn Sie wirklich den Inhalt von somefile.js haben müssen, würde ich einen Karma-Präprozessor verwenden und den Dateiinhalt konsumieren. – awei

+1

Ich kann, aber einige Antworten sind ziemlich groß, also würde ich es lieber nur bei Bedarf einfügen. – Evgeni

31

Da $ httpBackend nicht mit zurück Versprechen arbeiten, besteht eine Möglichkeit, dies zu tun ist Ihre Daten synchron zu bekommen. $ Http verfügt nicht über eine synchrone Option aus der Box, so würden Sie den Anruf an den Dateien, ohne sie machen müssen, etwa so:

$httpBackend.whenPOST('/phones').respond(function(method, url, data) { 
    var request = new XMLHttpRequest(); 

    request.open('GET', '/responses/phones.js', false); 
    request.send(null); 

    return [request.status, request.response, {}]; 
}); 
+0

Unglaublich! Ich habe einen ganzen Tag damit verbracht, herauszufinden, ob ich $ http verwenden könnte, um meine Datendatei abzurufen, und hätte wahrscheinlich aufgegeben, wenn es nicht so wäre. Danke @ dc-. –

+0

Dank Mann – btm1

+0

das ist die beste Lösung bisher. Denken Sie daran, dass Karma "Basis" als Präfix verwendet oder verwenden Sie Proxy-Konfiguration, um zu vermeiden. Als Vorschlag sollten Sie zuerst den vollständigen Pfad wie 'http: // localhost: 9876/base/src/app/modules/mock-data.json' verwenden, um zu verifizieren, dass die Datei durch das Testen von seession korrekt gehostet wird. Stellen Sie außerdem sicher, dass Sie JSON-Dateien in der Karma-Konfiguration zum Hosten von 'serveFiles' hinzufügen: [ 'src/jspm_packages /**/*.*', 'src/app/**/*. Ts', 'src/app/**/* .html ', ' src/typings/**/*. ts ', ' src/app/**/*. json '' –

6

Ich hatte das gleiche Problem, das ich mit gelöst:

$httpBackend.whenPOST("some/url").respond(function(method, url, data) { 
    return $resource("path/to/your/json/file.json").get(); 
}); 

Dies benötigt offensichtlich angular-resource Modul zu arbeiten.

+1

eine Idee, warum das funktioniert? '$ httpBackend' behandelt' asynchrone' Aufrufe nicht richtig? – Akash

Verwandte Themen