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

如何用Jasmine编写单元测试覆盖Angular响应式表单控件状态分支

Angular响应式表单分支覆盖的Jasmine单元测试方案

以下是针对你提供的代码分支,编写Jasmine单元测试覆盖所有条件场景的具体方案:

原业务代码片段

this.tableOptions.rowData.forEach((element: any) => {
  if (element.type.toLowerCase() == "payments") {
    if (
      this.oldValue == this.myForm.controls['nameControl'].value ||
      this.myForm.controls['nameControl'].untouched ||
      (this.myForm.controls['nameControl'].touched && !this.myForm.controls['nameControl'].dirty)
    ) {
      // 需要覆盖的分支逻辑
    }
  }
});

单元测试用例编写

先确保测试文件中已完成组件初始化、表单构建等前置操作,以下是三个核心场景的测试代码:

1. 覆盖oldValue与控件值相等分支

it('应该覆盖oldValue与nameControl值相等的分支', () => {
  // 准备测试数据:确保rowData包含type为payments的元素
  component.tableOptions.rowData = [{ type: 'Payments' }];
  // 初始化表单和oldValue
  component.myForm = new FormGroup({
    nameControl: new FormControl('test-value')
  });
  component.oldValue = 'test-value'; // 与控件值保持一致

  // 触发业务逻辑执行(假设这段逻辑在handleRowData方法中)
  component.handleRowData();

  // 根据实际业务逻辑替换断言,示例:检查分支内变量是否被修改
  expect(component.someFlag).toBe(true);
});

2. 覆盖控件untouched分支

it('应该覆盖nameControl处于untouched状态的分支', () => {
  component.tableOptions.rowData = [{ type: 'Payments' }];
  component.myForm = new FormGroup({
    nameControl: new FormControl('test-value')
  });
  // 显式设置控件为untouched状态(默认初始化后也是该状态,此处做显式保障)
  component.myForm.controls['nameControl'].markAsUntouched();
  component.oldValue = 'different-value'; // 与控件值不一致,排除第一个条件

  component.handleRowData();

  expect(component.someFlag).toBe(true);
});

3. 覆盖控件touched且!dirty分支

it('应该覆盖nameControl处于touched但未修改(!dirty)的分支', () => {
  component.tableOptions.rowData = [{ type: 'Payments' }];
  component.myForm = new FormGroup({
    nameControl: new FormControl('test-value')
  });
  // 将控件标记为touched,但不修改值(保持未修改状态)
  component.myForm.controls['nameControl'].markAsTouched();
  // 若控件曾被修改过,可通过markAsPristine重置为未修改状态
  // component.myForm.controls['nameControl'].markAsPristine();
  component.oldValue = 'different-value'; // 与控件值不一致,排除第一个条件

  component.handleRowData();

  expect(component.someFlag).toBe(true);
});

关键注意事项

  • 确保承载forEach逻辑的方法(如handleRowData)被正确调用,触发分支判断
  • 断言部分需根据分支内的实际业务逻辑调整,比如检查变量变化、方法调用状态等
  • 每个测试用例都要初始化包含type: 'Payments'的rowData,否则外层if分支不会进入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:54:59