我正在尝试进行一项小测试,确认控制器的定义。
我收到的错误是:
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 :(得分:1)
这是因为在测试中创建控制器时,您没有传递$ scope变量控制器。并且控制器尝试定义$ 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 });
答案 1 :(得分: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();
});
});
});
答案 2 :(得分:0)
像你这样把你的控制器变为
.controller('OrdersCtrl',['$scope', '$location', function($scope, $location) {
$scope.changeView = function(view){
$location.path(view); // path not hash
}
}]);