2017-04-07 5 views
0

Ich versuche, einen kleinen Test durchzuführen, der überprüft, ob der Controller definiert ist.

Der Fehler Ich erhalte ist:

myApp.orders module Order controller should .... FAILED 
    Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- OrdersCtrl 

Lesen ähnliche Fehler es etwas mit den Abhängigkeiten zu tun hat, aber ich weiß nicht, was los ist.

Controller:

'use strict'; 

angular.module('myApp.orders', ['ngRoute']) 

.config(['$routeProvider', function($routeProvider) { 
    $routeProvider.when('/orders', { 
    templateUrl: 'orders/orders.template.html', 
    controller: 'OrdersCtrl' 
    }); 
}]) 

.controller('OrdersCtrl', function($scope, $location) { 
    $scope.changeView = function(view){ 
    $location.path(view); // path not hash 
    } 
}); 

Test:

'use strict'; 

describe('myApp.orders module', function() { 

    beforeEach(module('myApp.orders')); 

    describe('Order controller', function(){ 

    it('should ....', inject(function($controller) { 
     //spec body 
     var OrdersCtrl = $controller('OrdersCtrl'); 
     expect(OrdersCtrl).toBeDefined(); 
    })); 

    }); 
}); 
+0

Dies sollte nicht der Fall sein, aber man kann mit .Controller ('OrdersCtrl' [ '$ scope', '$ location', function versuchen ($ scope, $ location) { $ scope.changeView = Funktion (view) { $ location.path (view); // Pfad nicht Hash } }]); – Indra

Antwort

1

Dies liegt daran, dass Sie nicht die $ scope sind vorbei variabl den Controller Einside, wenn Sie es schaffen im Test. Und der Controller versucht $ scope.changeView zu definieren, findet aber $ scope als undefined. Sie müssen eine $ scope-Variable an den Controller in Ihrem Test übergeben.

var $rootScope, $scope, $controller; 

beforeEach(function() { 
    module('myApp.orders'); 

    inject(function (_$rootScope_, _$controller_) { 
     $rootScope = _$rootScope_; 
     $scope = _$rootScope_.$new(); 
     $controller = _$controller_; 
    }); 
}); 

und in Ihrem Test,

var OrdersCtrl = $controller('OrdersCtrl', { $scope: $scope }); 
+0

Das funktioniert, aber ich verstehe nicht, warum der Test aus dem offiziellen Leitfaden: https://docs.angularjs.org/guide/controller nicht funktioniert? Könntest du es vielleicht erklären? – DowinskiField

+0

@DowinskiField Wie Sie im Test in der Dokumentation auch sehen können. Sie müssen $ scope an den Controller übergeben, wie er vom Controller benötigt wird. Um einen neuen $ scope zu erstellen, müssen Sie das mit _ $ rootScope _. $ New() tun. – Shahzad

0

Restructure Ihr Gerät zu testen leicht. Wir haben ein Muster, bei dem der Controller in beforeEach() definiert ist, damit er für den Test bereit ist. Sie müssen auch den Controller importieren Sie testen:

import ControllerToTest from 'path/to/your/real/controller'; 
describe('myApp.orders module',() => { 
    let vm; 
    beforeEach(() => { 
    inject(($controller, $rootScope) => { 
     vm = $controller(ControllerToTest, 
     { 
      $scope: $rootScope.$new() 
     }; 
    }); 
    }); 

    describe('Order Controller',() => { 
    it('should do something',() => { 
     expect(vm).toBeDefined(); 
    }); 
    }); 
}); 
0

Chaneg Ihren Controller wie diese

.controller('OrdersCtrl',['$scope', '$location', function($scope, $location) { 
     $scope.changeView = function(view){ 
     $location.path(view); // path not hash 
     } 
    }]); 
Verwandte Themen