You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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块里裸写。

正确的解决步骤

下面是标准的写法,一步步来:

  1. 确保引入ngMock模块:首先要确认你的Karma配置(karma.conf.js)里已经包含了angular-mocks.js,它提供了测试所需的注入器和模拟工具。
  2. 在beforeEach中注入$rootScope:用beforeEach块来初始化$rootScope,保证每个测试用例都能拿到干净的实例。这里用下划线包裹服务名是Angular测试的约定,避免变量名冲突。
  3. 创建新作用域:现在就能安全地调用$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:39:43