2017-02-23 6 views
0

Ich benutze Jasmine, um meine Angular-Anwendung zu testen. Einige der Controller sind mit einem separaten Access-Controller erweitert ihr eine Initialisierung Funktion geben:Controller während der Tests in einen anderen Controller injizieren

angular.module("myApp").controller("myCtrl", ["$scope", "someOtherServices", function($scope, someOtherServices) { 
    var _this = this; 
    $controller('accessController', { accessCtrl: _this }); 

    // Some more functions 

    _this.init(function() { 
    // Load in the data 
    }); 

}]); 

Die init-Funktion stammt aus dem Accesscontroller, die einen Access-Dienst verwendet, und sieht ungefähr so ​​aus:

angular.module("myApp").controller("accessController", ["Access", "accessCtrl", function(Access, accessCtrl) { 

    //Some initial setup 

    accessCtrl.init = function (func) { 

    Access.checkPermissions().then(function() { 
    // Permissions specific config 
    func(); 
    }); 

}]); 

Mein Test-Spezifikation sieht in etwa wie folgt aus:

describe('myCtrl', function() { 

    beforeEach(module('myApp')); 

    var $controller; 

    beforeEach(inject(function(_$controller_){ 
    $controller = _$controller_; 
    })); 

    describe('someTest', function() { 
    var $scope, controller, Contacts; 

    beforeEach(function() { 
     $scope = {}; 
     someOtherServices = {}; 

     myCtrl = $controller('myCtrl', {$scope:$scope, someOtherServices: someOtherServices}); 
    }); 

    it ('Does something as expected', function() { 
     expect(myCtrl.someFunction).toBe(‘pass value’); 
    }); 
    }); 

}); 

Das Problem, das ich bekommen ist, dass mit der Linie $controller('accessController', { accessCtrl: _this }); in der Steuerung, die tes t schlägt mit dem Fehler:

Error: [$injector:unpr] Unknown provider: AccessProvider <- Access <- accessController 

Obwohl ich die Dienste spotten kann, die in die Steuerung injiziert ich direkt testen bin, kann ich nicht einen Weg spöttisch den Access-Dienst findet in die Access injiziert werden. Wie kann dies erreicht werden? Die Dokumentation sagt "Wenn Sie einen verschachtelten Controller testen müssen, müssen Sie die gleiche Bereichs-Hierarchie in Ihrem Test erstellen, die im DOM vorhanden ist:" Wenn ich diese Hierarchie jedoch in der Spezifikation erstelle, wird sie im Test nicht verwendet.

https://docs.angularjs.org/guide/controller

Antwort

0

Access ist als jeder andere Dienst mit angular.mock.module verspottet:

beforeEach(module('myApp', { 
    Access: { ... } 
})); 

Es spielt keine Rolle, ob es in der Steuerung verwendet wird, oder anderswo.

+0

Danke. Was ist der Unterschied zwischen dem Injizieren des Dienstes in das Modul wie in Ihrer Antwort und dem Injizieren in den Controller wie alle anderen Dienste in der Frage? –

+0

Die Abhängigkeit in $ controller betrifft nur den instanziierten Controller (dies wird als lokale Abhängigkeit bezeichnet). Auf diese Weise ist es etwas einfacher, aber es wird nicht funktionieren, wenn es mehr als nur einen Controller gibt. Beide Möglichkeiten können zum Testen verwendet werden. – estus

Verwandte Themen