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.
quelle
JSON über das Fixture zu bedienen ist am einfachsten, aber aufgrund unseres Setups konnten wir das nicht einfach machen, also habe ich eine alternative Hilfsfunktion geschrieben:
Repository
Installieren
Verwendung
Fügen Sie karma-read-json.js in Ihre Karma-Dateien ein. Beispiel:
Stellen Sie sicher, dass Ihr JSON von Karma bedient wird. Beispiel:
Verwenden Sie die
readJSON
Funktion in Ihren Tests. Beispiel:quelle
npm install karma-read-json
stattbower install karma-read-json
Ich habe Probleme, eine Lösung zum Laden externer Daten in meine Testfälle zu finden. Der obige Link: http://dailyjs.com/2013/05/16/angularjs-5/ Hat für mich funktioniert.
Einige Notizen:
"defaultJSON" muss als Schlüssel in Ihrer Scheindatendatei verwendet werden. Dies ist in Ordnung, da Sie nur auf defaultJSON verweisen können.
mockedDashboardJSON.js:
Dann in Ihrer Testdatei:
quelle
Sieht so aus, als wäre Ihre Lösung die richtige, aber es gibt zwei Dinge, die ich nicht mag:
Ich bin gerade auf dieses Problem gestoßen und musste es schnell lösen, da ich keine Zeit mehr für die Frist hatte, und ich habe Folgendes getan
Meine JSON-Ressource war riesig und ich konnte sie nicht kopieren und in den Test einfügen, sodass ich sie in einer separaten Datei aufbewahren musste. Ich entschied mich jedoch dafür, sie als Javascript und nicht als JSON zu speichern, und dann tat ich einfach:
var someUniqueName = ... the json ...
und ich habe dies in Karma Conf aufgenommen.
Ich kann immer noch eine Backend-http-Antwort verspotten, wenn nötig.
$httpBackend.whenGET('/some/path').respond(someUniqueName);
Ich könnte auch ein neues Winkelmodul schreiben, das hier enthalten sein soll, und dann die JSON-Ressource so ändern, dass sie so etwas wie ist
angular.module('hugeJsonResource', []).constant('SomeUniqueName', ... the json ... );
und dann einfach
SomeUniqueName
in den Test injizieren , der sauberer aussieht.vielleicht sogar in einen Dienst einwickeln
Diese Lösung war für mich schneller, genauso sauber und erforderte keine neue Lernkurve. also bevorzuge ich diesen.
quelle
Ich habe das Gleiche gesucht. Ich werde diesen Ansatz versuchen . Es verwendet die Konfigurationsdateien, um die Scheindatendateien einzuschließen, aber die Dateien sind etwas mehr als json, da der json an angular.module ('MockDataModule'). Value übergeben werden muss und Ihre Unit-Tests dann auch mehrere Module laden können und dann steht der eingestellte Wert zur Verfügung, um in den Aufruf von beforeEach injiziert zu werden.
Es wurde auch ein anderer Ansatz gefunden , der für xhr-Anfragen, die nicht teuer sind, vielversprechend aussieht. Es ist ein großartiger Beitrag, der Midway-Tests beschreibt. Wenn ich das richtig verstehe, kann Ihr Controller / Service tatsächlich Daten wie bei einem e2e-Test abrufen, aber Ihr Midway-Test hat tatsächlich Zugriff auf den Controller-Bereich (e2e glaube ich nicht).
quelle
Es gibt Karma-Präprozessoren, die auch mit JSON-Dateien arbeiten. Hier ist einer:
https://www.npmjs.org/package/karma-ng-json2js-preprocessor
Und schamloser Stecker, dieser ist einer, den ich entwickelt habe und der RequireJS-Unterstützung bietet
https://www.npmjs.org/package/karma-ng-json2js-preprocessor-requirejs
quelle
Sie können den Präprozessor karma-html2js-verwenden , um die JSON- Dateien zum globalen __html__ hinzuzufügen.
Weitere Informationen finden Sie in dieser Antwort: https://stackoverflow.com/a/22103160/439021
quelle
Hier ist eine Alternative zu Camerons Antwort, ohne dass
jasmine-jquery
eine zusätzliche Karma-Konfiguration erforderlich ist, um z. B. einen Angular-Dienst zu testen, indem Sie$resource
:Und der entsprechende Unit Test:
quelle