2017-04-07 6 views
0

J'essaie de faire un petit test qui valide si le contrôleur est défini.

L'erreur que je reçois est:

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

lecture erreurs similaires, il a quelque chose à voir avec les dépendances, mais je ne sais pas ce qui ne va pas.

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

Cela ne devrait pas être le cas, mais vous pouvez essayer avec .Commande ('OrdersCtrl', [ 'étendue $', '$ location', la fonction ($ scope, $ location) { $ scope.changeView = fonction (vue) { $ location.path (vue); // chemin non hash } }]); – Indra

Répondre

1

Ceci est parce que vous n'êtes pas passer le champ de $ Variabl einside le contrôleur lorsque vous le créez en test. Et le contrôleur essaie de définir $ scope.changeView, mais il trouve $ scope comme non défini. Vous devez transmettre une variable $ scope au contrôleur dans votre test.

var $rootScope, $scope, $controller; 

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

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

et dans votre test,

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

Cela fonctionne, mais je ne comprends pas pourquoi le test du guide officiel: https://docs.angularjs.org/guide/controller ne fonctionne pas? Pourriez-vous peut-être expliquer. – DowinskiField

+0

@DowinskiField Comme vous pouvez le voir dans le test dans la documentation aussi. Vous devez passer $ scope au contrôleur comme requis par le contrôleur. Pour créer une nouvelle $ scope, vous devez le faire avec _ $ rootScope _. $ New(). – Shahzad

0

Restructurer votre test unitaire légèrement. Nous avons un motif où le contrôleur est défini dans le beforeEach(), donc il est prêt pour le test. Vous devez également importer le contrôleur que vous testez:

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 votre contrôleur comme celui-ci

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