找不到变量:$rootScope
Can't find variable: $rootScope
我是单元测试的新手,尽管我的测试是正确的,但我还是遇到了这些错误,但我只是无法弄清楚这些错误是什么意思,我已经尝试了几种方法
Can't find variable: $rootScope
Error: Injector already created, can not register a module!
spec.js
describe('test broadcast', function () {
var $controller;
beforeEach(function() {
module('test');
inject(function (_$rootScope_, _$controller_) {
$rootScope = _$rootScope_;
spyOn($rootScope, '$broadcast');
// Notice how inject $controller here.
$controller = _$controller_;
});
});
it("should broadcast something", function ($rootScope) {
$controller('myCtrl', {
// Pass in the $rootScope dependency.
$rootScope: $rootScope.$new()
})
// Here we actually run the controller.
expect($rootScope.$broadcast).toHaveBeenCalledWith('update');
//someObj = { data: testData};
//expect($rootScope.$broadcast).toHaveBeenCalledWith('update', someObj);
});
})
控制器
(function () {
var test= angular.module('test');
test.controller('myCtrl',
function($rootScope, $scope, $resource, $location, $route, $routeParams, $log, catalogData) {
$log.debug("myCtrl");
$log.debug(myCtrl);
$rootScope.$broadcast("update", {
data: testData
});
}); // catalogCtrl
})();
您定义了一个名为 rootScope
的变量,而不是 $rootScope
- 更改您的定义:
rootScope.$apply();
虽然我个人喜欢这样定义它们:
var $rootScope;
beforeEach(inject(function(_$rootScope_) {
$rootScope = _$rootScope_;
}));
编辑 2:
您无法在 it
函数中访问 $rootScope
,因为它不在当前 javascript scope 中(不是 angular $scope,不要不要混淆)。
您需要在顶部的控制器旁边定义它。
var $controller, $rootScope
并从您的 it
函数中删除 $rootScope
,这样您就不会覆盖它。
// Notice there is no $rootScope parameter.
it("should broadcast something", function () {
//Code
}
您还必须传入其他依赖项。
与 OP 讨论后,整个代码应如下所示:
describe('test broadcast', function () {
var $controller, $rootScope;
beforeEach(function() {
module('test');
inject(function (_$rootScope_, _ $controller_) {
$rootScope = _$rootScope_;
spyOn($rootScope, '$broadcast');
$controller = _$controller_;
});
});
it("should broadcast something", function () {
$controller('myCtrl', {
$scope: $rootScope.$new(),
catalogData: {}
})
expect($rootScope.$broadcast).toHaveBeenCalledWith('update', {catalog:{}})});
})
编辑 1:
您正在传递 $scope
依赖项。 $broadcast
在 $rootScope
上调用,因此您需要将其传入。像这样:
var testScope = $rootScope.$new()
$controller('myCtrl', {
// Pass in the $rootScope dependency.
$rootScope: testScope
}
原始post(以防它对任何人仍然有用)
您实际上并没有在测试套件的任何地方调用您的控制器。
你需要有类似的东西
var $controller
beforeEach(inject(function (_$rootScope_, _$controller_) {
$rootScope = _$rootScope_;
spyOn($rootScope, '$broadcast');
// Notice how inject $controller here.
$controller = _$controller_;
}));
然后在你的测试中初始化它:
it("should broadcast something", function () {
// Here we actually run the controller.
$controller('myCtrl', {
// Pass in the $rootScope dependency.
$rootScope: $rootScope.$new()
}
expect($rootScope.$broadcast).toHaveBeenCalledWith('catalogUpdate');
someObj = { catalog: catalogData};
expect($rootScope.$broadcast).toHaveBeenCalledWith('catalogUpdate', someObj);
});
这将消除有关 $rootScope.broadcast 未被调用的错误。
看看这里的 "Testing Controllers" 部分:https://docs.angularjs.org/guide/controller
至于无法注册模块,如果您在 beforeEach(module('abc'))
之前有一个 inject()
,通常会发生这种情况。
如错误所述,调用 inject 后无法注册另一个模块。
我是单元测试的新手,尽管我的测试是正确的,但我还是遇到了这些错误,但我只是无法弄清楚这些错误是什么意思,我已经尝试了几种方法
Can't find variable: $rootScope
Error: Injector already created, can not register a module!
spec.js
describe('test broadcast', function () {
var $controller;
beforeEach(function() {
module('test');
inject(function (_$rootScope_, _$controller_) {
$rootScope = _$rootScope_;
spyOn($rootScope, '$broadcast');
// Notice how inject $controller here.
$controller = _$controller_;
});
});
it("should broadcast something", function ($rootScope) {
$controller('myCtrl', {
// Pass in the $rootScope dependency.
$rootScope: $rootScope.$new()
})
// Here we actually run the controller.
expect($rootScope.$broadcast).toHaveBeenCalledWith('update');
//someObj = { data: testData};
//expect($rootScope.$broadcast).toHaveBeenCalledWith('update', someObj);
});
})
控制器
(function () {
var test= angular.module('test');
test.controller('myCtrl',
function($rootScope, $scope, $resource, $location, $route, $routeParams, $log, catalogData) {
$log.debug("myCtrl");
$log.debug(myCtrl);
$rootScope.$broadcast("update", {
data: testData
});
}); // catalogCtrl
})();
您定义了一个名为 rootScope
的变量,而不是 $rootScope
- 更改您的定义:
rootScope.$apply();
虽然我个人喜欢这样定义它们:
var $rootScope;
beforeEach(inject(function(_$rootScope_) {
$rootScope = _$rootScope_;
}));
编辑 2:
您无法在 it
函数中访问 $rootScope
,因为它不在当前 javascript scope 中(不是 angular $scope,不要不要混淆)。
您需要在顶部的控制器旁边定义它。
var $controller, $rootScope
并从您的 it
函数中删除 $rootScope
,这样您就不会覆盖它。
// Notice there is no $rootScope parameter.
it("should broadcast something", function () {
//Code
}
您还必须传入其他依赖项。 与 OP 讨论后,整个代码应如下所示:
describe('test broadcast', function () {
var $controller, $rootScope;
beforeEach(function() {
module('test');
inject(function (_$rootScope_, _ $controller_) {
$rootScope = _$rootScope_;
spyOn($rootScope, '$broadcast');
$controller = _$controller_;
});
});
it("should broadcast something", function () {
$controller('myCtrl', {
$scope: $rootScope.$new(),
catalogData: {}
})
expect($rootScope.$broadcast).toHaveBeenCalledWith('update', {catalog:{}})});
})
编辑 1:
您正在传递 $scope
依赖项。 $broadcast
在 $rootScope
上调用,因此您需要将其传入。像这样:
var testScope = $rootScope.$new()
$controller('myCtrl', {
// Pass in the $rootScope dependency.
$rootScope: testScope
}
原始post(以防它对任何人仍然有用)
您实际上并没有在测试套件的任何地方调用您的控制器。
你需要有类似的东西
var $controller
beforeEach(inject(function (_$rootScope_, _$controller_) {
$rootScope = _$rootScope_;
spyOn($rootScope, '$broadcast');
// Notice how inject $controller here.
$controller = _$controller_;
}));
然后在你的测试中初始化它:
it("should broadcast something", function () {
// Here we actually run the controller.
$controller('myCtrl', {
// Pass in the $rootScope dependency.
$rootScope: $rootScope.$new()
}
expect($rootScope.$broadcast).toHaveBeenCalledWith('catalogUpdate');
someObj = { catalog: catalogData};
expect($rootScope.$broadcast).toHaveBeenCalledWith('catalogUpdate', someObj);
});
这将消除有关 $rootScope.broadcast 未被调用的错误。
看看这里的 "Testing Controllers" 部分:https://docs.angularjs.org/guide/controller
至于无法注册模块,如果您在 beforeEach(module('abc'))
之前有一个 inject()
,通常会发生这种情况。
如错误所述,调用 inject 后无法注册另一个模块。