Karma Jasmine测试创建新Scope时出现TypeError错误求助
解决Karma Jasmine中创建Scope时出现的TypeError: Cannot read property '$new' of undefined
嘿,刚上手Angular测试遇到这个问题太正常了,别慌!这个错误的核心原因很简单:你没有正确地让Angular测试注入器初始化并提供$rootScope实例。直接在describe块里写注入代码是行不通的,得遵循Angular测试的规范步骤来。
问题根源
你尝试直接调用$rootScope.$new()时,$rootScope还是undefined——因为Angular的测试环境需要通过inject()函数来获取服务实例,而且这个过程得在测试初始化阶段(比如beforeEach)完成,不能直接在describe块里裸写。
正确的解决步骤
下面是标准的写法,一步步来:
- 确保引入ngMock模块:首先要确认你的Karma配置(
karma.conf.js)里已经包含了angular-mocks.js,它提供了测试所需的注入器和模拟工具。 - 在beforeEach中注入$rootScope:用
beforeEach块来初始化$rootScope,保证每个测试用例都能拿到干净的实例。这里用下划线包裹服务名是Angular测试的约定,避免变量名冲突。 - 创建新作用域:现在就能安全地调用
$rootScope.$new()了。
完整示例代码:
describe('你的测试套件名称', function() { // 先声明变量存$rootScope var $rootScope; // 在每个测试前注入初始化$rootScope beforeEach(inject(function(_$rootScope_) { $rootScope = _$rootScope_; })); it('应该成功创建新的作用域', function() { // 现在$rootScope已经是可用的实例了 var newScope = $rootScope.$new(); // 可以加个简单断言验证 expect(newScope).toBeDefined(); expect(newScope.$parent).toBe($rootScope); }); });
额外注意点
- 如果你是在测试控制器,有时候会用
$controller服务来创建控制器并传递新作用域,比如:beforeEach(inject(function(_$controller_, _$rootScope_) { $rootScope = _$rootScope_; var scope = $rootScope.$new(); // 创建控制器时传入这个新作用域 MyController = _$controller_('MyController', { $scope: scope }); })); - 一定要确保所有依赖的Angular脚本(angular.js、angular-mocks.js)都在Karma的files配置里正确加载,不然注入器根本无法工作。
内容的提问来源于stack exchange,提问作者Aaron Rabinowitz
相关产品推荐
相关产品推荐

