2017-04-07 111 views
0

我正在尝试做一个小的测试工作来验证控制器是否已定义。

我收到的错误是:

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

阅读类似的错误,它是与依赖关系,但我不知道什么是错。

控制器:

'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 
    } 
}); 

测试:

'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

这不应该是这样,但你可以.controller( 'OrdersCtrl',[ '$范围', '$位置',功能尝试( $ scope,$ location){ $ scope.changeView = function(view){ $ location.path(view); // path not hash } }]); – Indra

回答

1

这是因为你没有通过$范围variabl einside当你创造它的控制器在测试中。控制器试图定义$ scope.changeView,但它发现$ scope为undefined。 您需要在测试中将$ scope变量传递给控制器​​。

var $rootScope, $scope, $controller; 

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

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

,并在您的测试,

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

这工作,但我不明白为什么从官方指导测试:https://docs.angularjs.org/guide/controller不工作?你能解释一下吗? – DowinskiField

+0

@DowinskiField正如你可以在文档中的测试中看到的一样。您需要将$ scope传递给控制器​​,因为它是控制器所需的。为了创建新的$ scope,你需要通过_ $ rootScope _。$ new()来完成。 – Shahzad

0

调整你的单元测试轻微。我们有一个模式,在beforeEach()中定义了控制器,因此它已准备好进行测试。您还需要导入控制器,你要测试:

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控制器这样

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