Ich habe eine AngularJS-App mit Tests mit Karma + Jasmine eingerichtet. Ich möchte eine Funktion testen, die ein großes JSON-Objekt verwendet, es in ein Format konvertiert, das vom Rest der App mehr verwendet werden kann, und das konvertierte Objekt zurückgibt. Das ist es.
Für meine Tests möchte ich, dass Sie separate JSON-Dateien (* .json) haben, die nur falschen JSON-Inhalt enthalten - kein Skript. Für den Test möchte ich in der Lage sein, die JSON-Datei zu laden und das Objekt in die Funktion zu pumpen, die ich teste.
Ich weiß, dass ich den JSON wie hier beschrieben in eine Mock-Factory einbetten kann: http://dailyjs.com/2013/05/16/angularjs-5/, aber ich möchte wirklich, dass der JSON nicht im Skript enthalten ist - nur direkter JSON Dateien.
Ich habe ein paar Dinge ausprobiert, aber ich bin in diesem Bereich ziemlich noob. Zuerst habe ich mein Karma so eingerichtet, dass es meine JSON-Datei enthält, um zu sehen, was es tun würde:
files = [
...
'mock-data/**/*.json'
...
]
Dies führte zu:
Chrome 27.0 (Mac) ERROR
Uncaught SyntaxError: Unexpected token :
at /Users/aaron/p4workspace4/depot/sitecatalyst/branches/anomaly_detection/client/anomaly-detection/mock-data/two-metrics-with-anomalies.json:2
Also habe ich es geändert, um nur die Dateien bereitzustellen und sie nicht "einzuschließen":
files = [
...
{ pattern: 'mock-data/**/*.json', included: false }
...
]
Jetzt, da sie nur noch bereitgestellt werden, dachte ich, ich würde versuchen, die Datei mit $ http aus meiner Spezifikation heraus zu laden:
$http('mock-data/two-metrics-with-anomalies.json')
Als ich die Spezifikation ausführte, erhielt ich:
Error: Unexpected request: GET mock-data/two-metrics-with-anomalies.json
Was nach meinem Verständnis bedeutet, dass eine verspottete Antwort von $ httpBackend erwartet wird. Also ... zu diesem Zeitpunkt wusste ich nicht, wie ich die Datei mit Angular-Dienstprogrammen laden sollte, also dachte ich, ich würde jQuery ausprobieren, um zu sehen, ob ich das zumindest zum Laufen bringen könnte:
$.getJSON('mock-data/two-metrics-with-anomalies.json').done(function(data) {
console.log(data);
}).fail(function(response) {
console.log(response);
});
Das führt zu:
Chrome 27.0 (Mac) LOG: { readyState: 4,
responseText: 'NOT FOUND',
status: 404,
statusText: 'Not Found' }
Ich inspiziere diese Anfrage in Charles und sie macht eine Anfrage an
/mock-data/two-metrics-with-anomalies.json
Während der Rest der Dateien, die ich so konfiguriert habe, dass sie von Karma "eingeschlossen" werden, angefordert wird, zum Beispiel:
/base/src/app.js
Anscheinend richtet Karma eine Art Basisverzeichnis ein, aus dem die Dateien bereitgestellt werden. Also habe ich meine KQuery-Datenanforderung für Kicks in geändert
$.getJSON('base/mock-data/two-metrics-with-anomalies.json')...
Und es funktioniert! Aber jetzt fühle ich mich schmutzig und muss duschen. Hilf mir, mich wieder sauber zu fühlen.