Angular 测试:Karma 与 Jasmine
在 Angular 开发中,测试是保证代码质量的关键环节。要掌握 Angular 测试,首先需要理解两个核心工具的分工:Jasmine 是测试框架,负责提供编写测试用例的语法和断言库(即“怎么写测试”);Karma 是测试运行器,负责启动浏览器、执行测试代码并输出结果(即“怎么跑测试”)。默认情况下,Angular CLI 创建的项目已经集成了这两者。
以下步骤将指导你从零开始编写并运行第一个 Angular 单元测试。
准备工作
确保你的开发环境已经安装了 Node.js 和 Angular CLI。如果尚未创建项目,请先新建一个。
- 打开 终端(命令行工具)。
- 运行 以下命令创建一个新的 Angular 项目(如果已有项目可跳过此步):
ng new my-test-app
- 在创建过程中,当 CLI 询问
Would you like to add Angular routing?时,根据需求输入y或n。 - 当询问
Which stylesheet format would you like to use?时,选择 CSS 或其他你熟悉的格式。 - 进入 项目目录:
cd my-test-app
理解测试文件结构
Angular 使用 .spec.ts 后缀来命名测试文件。当你使用 CLI 生成组件或服务时,会自动生成对应的测试文件。
- 打开 项目中的
src/app/app.component.spec.ts文件。这是默认的主组件测试文件。 - 观察 文件顶部的导入语句。我们会看到
TestBed,它是 Angular 测试工具的核心,用于创建测试模块。
Jasmine 的核心语法主要由以下几个部分组成,下表总结了它们的功能:
| 关键字 | 功能描述 | 示例场景 |
|---|---|---|
describe |
定义一个测试套件,将相关的测试用例分组。 | “测试登录组件的所有功能”。 |
it |
定义一个具体的测试用例。 | “输入正确密码时,应登录成功”。 |
expect |
定义断言,判断实际结果是否符合预期。 | “期待返回值为 true”。 |
beforeEach |
在每个测试用例执行前运行的预处理代码。 | “每次测试前重置变量”。 |
编写基础单元测试
我们将修改 app.component.spec.ts,编写一个简单的测试来验证组件标题的显示。
- 定位 到
describe('AppComponent')代码块。 - 找到 第一个
it测试用例,通常名为should create the app。 - 保留
beforeEach中的fixture = TestBed.createComponent(AppComponent)和component = fixture.componentInstance代码,这是初始化组件的标准写法。 - 编写 或 修改 一个测试用例,用于验证组件的
title属性:
it('should have as title "my-test-app"', () => {
expect(component.title).toEqual('my-test-app');
});
- 编写 一个测试用例,验证页面元素是否正确渲染了标题。这里需要用到
debugElement和nativeElement来查询 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 运行器来执行它们。
- 确保 你仍然位于项目根目录下。
- 运行 以下命令启动测试:
ng test
- 等待 浏览器自动弹出(通常是 Chrome)。Karma 会在该浏览器中运行测试代码。
- 观察 终端或浏览器中的输出结果。如果所有测试通过,你会看到绿色的 SUCCESS 提示。
- 检查 浏览器页面,它会显示详细的测试列表和执行状态。
测试工作流原理
为了更直观地理解 Karma 与 Jasmine 如何协同工作,请参考以下流程:
graph LR
A["开发者编写 .spec.ts 代码"] --> B["Karma 启动服务器"]
B --> C["Karma 加载浏览器环境"]
C --> D["Jasmine 执行测试用例"]
D --> E{测试通过?}
E -- 是 --> F["显示绿色成功结果"]
E -- 否 --> G["显示红色失败详情"]
添加自定义测试逻辑
为了让测试更实用,我们模拟一个场景:组件中有一个方法返回两个数字的和。
- 打开
src/app/app.component.ts。 - 添加 一个简单的加法方法到类中:
sum(a: number, b: number): number {
return a + b;
}
- 回到
src/app/app.component.spec.ts文件。 - 添加 一个新的
it测试用例来验证这个方法:
it('should calculate sum of two numbers', () => {
const result = component.sum(5, 3);
expect(result).toEqual(8);
});
- 保存 所有文件。Karma 配置了监听模式,会自动检测文件变化并重新运行测试。
- 查看 浏览器,新的测试用例应该会立即显示并通过。
调试失败的测试
如果测试失败,需要快速定位问题。
- 故意 将上述测试中的预期值修改为错误的数字,例如
expect(result).toEqual(10);。 - 观察 浏览器或终端,你会看到红色的失败信息,提示
Expected 8 to equal 10.。 - 点击 浏览器列表中失败的测试用例行号。
- 利用 浏览器的开发者工具(按
F12),在Sources面板中设置断点进行调试。 - 修复 代码,将预期值改回
8,确认测试恢复通过。

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