Wie kann ich eine Direktive mit templateUrl in Chutzpahs kopflosem Browser testen?

Weiß jemand, wie man einen kopflosen Browser wie den Visual Studio Test Adapter von Chutzpah erhält, um einer Direktive den Zugriff auf die HTML-Vorlagendatei zu ermöglichen? Chutzpah verwendet PhantomJS für einen Browser ohne Kopf, was meine Möglichkeiten einschränkt.

Ich verwende Chutzpah Test Adapter 2.5 und AngularJS 1.2.0-r.2.

Ich erhalte den Fehler:

Unerwartete Anforderung: GET myApp / directives / template.html

Dies ist darauf zurückzuführen, dass Angular versucht, mit dem Dienst $ http auf die Vorlage meiner Direktive zuzugreifen.

Ich habe verschiedene Problemumgehungen gefunden:

Manuelles Verwenden von XMLHttpRequest zum Importieren der Vorlagen.Verwenden Sie ein Dienstprogramm wie Grunt, um die Vorlage in den JS-Code Ihrer Direktive einzufügen.$httpBackend.when('GET', 'myApp/directives/template.html').passThrough() - Dies funktioniert nur bei E2E-Tests, nicht bei Unit-Tests.Fügen Sie die Vorlage direkt in den Testcode ein.

Keine dieser Optionen befriedigt mich besonders. Ich würde es vorziehen, die Direktive ihre Vorlage transparent laden zu lassen, damit ich sie als Komponente testen kann. Gibt es eine Möglichkeit, dieses Szenario zum Laufen zu bringen?

Beispielcode:

angular.module('myDirective', []).directive('myDirective', function() {
    return {
        restrict: 'E',
        transclude: true,
        templateUrl: 'myApp/directives/template.html',
        // Some other options, omitted for brevity.
    };
});

template.html:

<div><div ng-transclude></div></div>

Beispiel Jasmin Test:

describe('myDirective', function() {
    // Assign $scope using inject(), load module etc.
    // Insert workaround for $httpBackend loading my templateUrl here.
    it('should transclude content', function() {
        var element = $compile("<my-directive>Look Mom, I'm in my directive!</my-directive>")($scope);
        $scope.$digest();

        expect(element.text().trim()).toBe("Look Mom, I'm in my directive!");
    });
}

Antworten auf die Frage(6)

Ihre Antwort auf die Frage