Wie injiziere ich eine Scheinabhängigkeit in eine eckige Direktive mit Jasmine auf Karma

8

Ich habe die folgende Anweisung:

%Vor%

Ich möchte die Abhängigkeiten zum Einheitentest der verschiedenen Codepfade mit den von den Komponententests bekannten Werten verspotten. Ich habe den folgenden Beispieleinheitstest:

%Vor%

Das gibt mir zwei Probleme.

Da sich die Vorlage in einer externen Datei befindet, versucht sie beim Laden zunächst, sie abzurufen und Fehler zu beheben, da die Datei nirgendwo zu finden ist, was logisch ist, da sie sich in einer Testumgebung und nicht in einem tatsächlichen Server befindet / p>

Zweitens gibt es keine offensichtliche Möglichkeit, die Abhängigkeiten zu verspotten, die über den Konstruktor in die Direktive eingefügt werden. Beim Testen von Controllern können Sie den Dienst $controller verwenden, aber da Anweisungen indirekt durch das Kompilieren eines HTML-Tags mit einem übergebenen Bereich instanziiert werden, gibt es keine Möglichkeit, sie direkt zu instanziieren (z. B. gibt es kein analoges $directive ). Das hindert mich daran, $userDetails.name und $userDetails.gravatar auf 'test name' bzw. 'test avatar' zu setzen.

Wie bekomme ich die Anweisung, um ordnungsgemäß zu kompilieren und mit einer benutzerdefinierten $ userDetails-Abhängigkeit auszuführen?

    
Nicolás Straub 20.12.2013, 01:13
quelle

1 Antwort

17

Um die Vorlagendatei zu laden, müssen Sie karma-ng-html2js-preprocessor in Karma konfigurieren.

Besuchen Sie zuerst diese Seite und folgen Sie den Installationsanweisungen. Dann müssen Sie einige Einträge in Ihrer Datei karma.config.js hinzufügen:

%Vor%

Das sagt Karma, alle HTML-Dateien im Vorlagenordner zu laden (wenn Ihre Vorlagen woanders sind, legen Sie diesen Ordner dort ab).

%Vor%

Das weist Karma an, alle HTML-Dateien über den% preprocessor ng-html2js zu übergeben, der sie dann in eckige Module umwandelt, die die Vorlagen in den Dienst $templateCache bringen. Auf diese Weise, wenn $httpBackend den "Server" für die Vorlage abfragt, wird sie vom Vorlagen-Cache abgefangen und der korrekte HTML-Code zurückgegeben. Alles klar hier, mit Ausnahme der URL der Vorlage: Sie muss mit der Eigenschaft templateUrl in der Direktive übereinstimmen, und ng-html2js übergibt standardmäßig den vollständigen Pfad als URL. Also müssen wir diesen Wert umwandeln:

%Vor%

Dies empfängt filepath und leitet es durch einen regulären Ausdruck weiter extrahiert den Pfad, den Dateinamen und die Erweiterung in ein Array. Dann fügen Sie 'templates/ dem Dateinamen und der Erweiterung voran und Sie erhalten die erwartete uri.

Nachdem all dies getan wurde, ist das Vorbereiten der Vorlage eine Sache des Ladens des Moduls, bevor der Test ausgeführt wird:

%Vor%

Beachten Sie, dass module ein externer Service ist, der sich in angular-mocks.js .

Um einen benutzerdefinierten Service in die Direktive einzufügen, müssen Sie den Provider des Service überschreiben:

%Vor%

$provide ist der Service, der Ihren Providern zur Verfügung steht. Also, wenn Sie eine Scheinabhängigkeit injizieren wollen, überschreiben Sie hier den Anbieter.

Wenn dieser Code vor dem Test ausgeführt wird, haben Sie einen Mock $userDetails -Dienst, der Ihre vordefinierten Zeichenfolgen zurückgibt.

    
Nicolás Straub 20.12.2013, 01:13
quelle