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

使用Jest测试AngularJS服务遇[$injector:nomod]错误的解决咨询

解决Jest测试Angular服务时[$injector:nomod]模块找不到的问题

我来帮你一步步搞定这个测试问题,针对你提出的三个疑问逐一解答:

1. 如何Mock模块'superag'让mathService可以使用它?

Angular报错找不到superag模块,说明测试环境中没有加载这个模块的定义——这时候我们不需要加载真实的superag代码,而是用angular-mocks提供的能力Mock整个模块,并给mathService提供它需要的依赖服务就行。

具体做法是在测试的beforeEach中,用angular.mock.module创建一个mock版的superag模块,然后通过$provide注入mathService依赖的服务:

beforeEach(() => {
  // 第一步:Mock 'superag'模块
  angular.mock.module('superag', ($provide) => {
    // 假设mathService依赖superag里的superagService,这里Mock这个服务
    $provide.service('superagService', () => {
      // 定义Mock的方法,模拟真实服务的行为
      this.add = jest.fn((a, b) => a + b);
      this.multiply = jest.fn((a, b) => a * b);
    });
  });

  // 第二步:加载mathService所在的模块(比如你的服务在'myApp.services'里)
  angular.mock.module('myApp.services');
});

之后你就可以正常注入mathService,它会自动使用你Mock的superag模块里的服务。

2. 是否每次测试都必须导入声明该模块的app.js文件?

完全不需要。测试的核心是隔离性,我们只需要加载mathService本身的代码,以及它依赖的Mock模块即可,没必要导入整个app.js。这样做不仅能避免加载不必要的代码,还能让测试更聚焦、运行速度更快。

只有当你的mathService是直接声明在主app模块里,且无法单独拆分时,才需要加载app模块,但依然可以通过Mock替换掉superag模块,不让它加载真实代码。

3. 使用beforeEach(module('superag'))未成功,涉及package.json配置的问题

你直接调用module('superag')失败,大概率是这几个原因:

  • 缺少angular-mocks依赖或未正确导入
    首先确保你的package.json里安装了和Angular版本匹配的angular-mocks:

    {
      "devDependencies": {
        "angular": "^1.8.2",
        "angular-mocks": "^1.8.2",
        "jest": "^29.0.0"
      }
    }
    

    然后在测试文件顶部导入angular-mocks,或者在Jest的配置文件(比如jest.config.js)里设置setupFiles自动导入:

    // jest.config.js
    module.exports = {
      setupFiles: ['<rootDir>/src/setup-jest.js']
    };
    

    在setup-jest.js里添加:import 'angular-mocks';

  • 尝试加载真实的superag模块,但路径不对
    如果你没有Mock模块,直接调用module('superag'),Jest会尝试去找真实的superag模块文件,但如果文件路径没配置对(比如没在测试环境中引入),就会报错。这时候一定要用Mock的方式,而不是加载真实模块。

  • Jest配置未正确处理Angular文件
    确保Jest的transform配置能正确处理Angular的JS文件,比如用babel-jest转译:

    // jest.config.js
    module.exports = {
      transform: {
        '^.+\\.js$': 'babel-jest'
      }
    };
    

完整测试示例

这里给你一个可直接参考的完整测试代码:

import angular from 'angular';
import 'angular-mocks';
import './path/to/mathService'; // 导入你的mathService文件

describe('mathService', () => {
  let mathService;
  let mockSuperagService;

  beforeEach(() => {
    // Mock superag模块
    angular.mock.module('superag', ($provide) => {
      mockSuperagService = {
        multiply: jest.fn((a, b) => a * b)
      };
      $provide.value('superagService', mockSuperagService);
    });

    // 加载mathService所在的模块
    angular.mock.module('myApp.services');

    // 注入mathService
    angular.mock.inject((_mathService_) => {
      mathService = _mathService_;
    });
  });

  it('should use superagService to multiply numbers', () => {
    const result = mathService.calculateProduct(2, 3);
    // 验证mock服务被调用
    expect(mockSuperagService.multiply).toHaveBeenCalledWith(2, 3);
    // 验证结果符合预期
    expect(result).toBe(6);
  });
});

内容的提问来源于stack exchange,提问作者Roger Ramos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:04:49