文章目录

Angular 测试:Karma 与 Jasmine

发布于 2026-04-12 22:17:27 · 浏览 25 次 · 评论 0 条

Angular 测试:Karma 与 Jasmine

在 Angular 开发中,测试是保证代码质量的关键环节。要掌握 Angular 测试,首先需要理解两个核心工具的分工:Jasmine 是测试框架,负责提供编写测试用例的语法和断言库(即“怎么写测试”);Karma 是测试运行器,负责启动浏览器、执行测试代码并输出结果(即“怎么跑测试”)。默认情况下,Angular CLI 创建的项目已经集成了这两者。

以下步骤将指导你从零开始编写并运行第一个 Angular 单元测试。


准备工作

确保你的开发环境已经安装了 Node.js 和 Angular CLI。如果尚未创建项目,请先新建一个。

  1. 打开 终端(命令行工具)。
  2. 运行 以下命令创建一个新的 Angular 项目(如果已有项目可跳过此步):
ng new my-test-app
  1. 在创建过程中,当 CLI 询问 Would you like to add Angular routing? 时,根据需求输入 yn
  2. 当询问 Which stylesheet format would you like to use? 时,选择 CSS 或其他你熟悉的格式。
  3. 进入 项目目录:
cd my-test-app

理解测试文件结构

Angular 使用 .spec.ts 后缀来命名测试文件。当你使用 CLI 生成组件或服务时,会自动生成对应的测试文件。

  1. 打开 项目中的 src/app/app.component.spec.ts 文件。这是默认的主组件测试文件。
  2. 观察 文件顶部的导入语句。我们会看到 TestBed,它是 Angular 测试工具的核心,用于创建测试模块。

Jasmine 的核心语法主要由以下几个部分组成,下表总结了它们的功能:

关键字 功能描述 示例场景
describe 定义一个测试套件,将相关的测试用例分组。 “测试登录组件的所有功能”。
it 定义一个具体的测试用例。 “输入正确密码时,应登录成功”。
expect 定义断言,判断实际结果是否符合预期。 “期待返回值为 true”。
beforeEach 在每个测试用例执行前运行的预处理代码。 “每次测试前重置变量”。

编写基础单元测试

我们将修改 app.component.spec.ts,编写一个简单的测试来验证组件标题的显示。

  1. 定位describe('AppComponent') 代码块。
  2. 找到 第一个 it 测试用例,通常名为 should create the app
  3. 保留 beforeEach 中的 fixture = TestBed.createComponent(AppComponent)component = fixture.componentInstance 代码,这是初始化组件的标准写法。
  4. 编写修改 一个测试用例,用于验证组件的 title 属性:
it('should have as title "my-test-app"', () => {
  expect(component.title).toEqual('my-test-app');
});
  1. 编写 一个测试用例,验证页面元素是否正确渲染了标题。这里需要用到 debugElementnativeElement 来查询 DOM:
it('should render title in a h1 tag', () => {
  fixture.detectChanges(); // 触发变更检测,更新视图
  const compiled = fixture.nativeElement as HTMLElement;
  expect(compiled.querySelector('h1')?.textContent).toContain('my-test-app');
});

注意fixture.detectChanges() 至关重要,它模拟了 Angular 的变更检测周期,将数据绑定到 HTML 模板上。如果不调用它,模板可能还是空的。


运行测试

测试编写完成后,通过 Karma 运行器来执行它们。

  1. 确保 你仍然位于项目根目录下。
  2. 运行 以下命令启动测试:
ng test
  1. 等待 浏览器自动弹出(通常是 Chrome)。Karma 会在该浏览器中运行测试代码。
  2. 观察 终端或浏览器中的输出结果。如果所有测试通过,你会看到绿色的 SUCCESS 提示。
  3. 检查 浏览器页面,它会显示详细的测试列表和执行状态。

测试工作流原理

为了更直观地理解 Karma 与 Jasmine 如何协同工作,请参考以下流程:

graph LR A["开发者编写 .spec.ts 代码"] --> B["Karma 启动服务器"] B --> C["Karma 加载浏览器环境"] C --> D["Jasmine 执行测试用例"] D --> E{测试通过?} E -- 是 --> F["显示绿色成功结果"] E -- 否 --> G["显示红色失败详情"]

添加自定义测试逻辑

为了让测试更实用,我们模拟一个场景:组件中有一个方法返回两个数字的和。

  1. 打开 src/app/app.component.ts
  2. 添加 一个简单的加法方法到类中:
sum(a: number, b: number): number {
  return a + b;
}
  1. 回到 src/app/app.component.spec.ts 文件。
  2. 添加 一个新的 it 测试用例来验证这个方法:
it('should calculate sum of two numbers', () => {
  const result = component.sum(5, 3);
  expect(result).toEqual(8);
});
  1. 保存 所有文件。Karma 配置了监听模式,会自动检测文件变化并重新运行测试。
  2. 查看 浏览器,新的测试用例应该会立即显示并通过。

调试失败的测试

如果测试失败,需要快速定位问题。

  1. 故意 将上述测试中的预期值修改为错误的数字,例如 expect(result).toEqual(10);
  2. 观察 浏览器或终端,你会看到红色的失败信息,提示 Expected 8 to equal 10.
  3. 点击 浏览器列表中失败的测试用例行号。
  4. 利用 浏览器的开发者工具(按 F12),在 Sources 面板中设置断点进行调试。
  5. 修复 代码,将预期值改回 8,确认测试恢复通过。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文