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
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? –
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