我收到错误:
TypeError:无法读取属性' $ scope'未定义的
在$ controller(bower_components / angular / angular.js:10327:28)
在bower_components / angular-mocks / angular-mocks.js:2221:12
在上下文。 (SRC /客户端/应用程序/同行审查/后visit.controller.spec.js:11:18)
使用mocha和karma在angularJS控制器上运行测试时。
它试图运行的测试的初始化是:
describe('PostVisitController', function () {
var controller;
beforeEach(function () {
bard.appModule('app.peer-review');
bard.inject('$controller', '$log');
controller = $controller('PostVisitController');
});
bard.verifyNoOutstandingHttpRequests();
it('should be created successfully', function () {
expect(controller).to.be.defined;
});
});
它正在测试的控制器不需要$ scope,并且同一模块中其他控制器的测试正在通过。
答案 0 :(得分:2)
这是一个误导性错误。
当实例化控制器时,angular运行以下代码(来自angular.js),该代码检查控制器是否在它所定义的控制器列表中:
return function $controller(expression, locals, later, ident) {
var instance, match, constructor, identifier;
later = later === true;
if (ident && isString(ident)) {
identifier = ident;
}
if (isString(expression)) {
match = expression.match(CNTRL_REG);
if (!match) {
throw $controllerMinErr('ctrlfmt',
"Badly formed controller string '{0}'. " +
"Must match `__name__ as __id__` or `__name__`.", expression);
}
constructor = match[1],
identifier = identifier || match[3];
expression = controllers.hasOwnProperty(constructor) <———————— HERE
? controllers[constructor]
: getter(locals.$scope, constructor, true) ||
(globals ? getter($window, constructor, true) : undefined);
assertArgFn(expression, constructor, true);
}
如果在数组中找不到控制器,它会运行一个试图从'locals'变量读取$ scope的getter(可以为null)。
如果测试的索引文件中未包含控制器,则控制器不在数组中。包含该文件将解决问题。