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

如何用Jasmine测试数组内对象的部分属性(排除自动UUID)

问题

我正在使用Jasmine测试PopupComponent,该组件的表单包含多个FormControl,提交后会向FormArray中添加一条数据。我需要验证表单输入值是否正确保存到FormArray中,但新增数据时会自动生成UUID,我不想对该字段进行测试。

示例数据如下:

{
  uuid: 'd3d354c9-ad70-4bef-9b40-e30047f1e203',
  age: '23',
  name: 'John',
  job: 'Software Engineer'
}

我尝试了以下测试代码:

expect(values).toEqual([{
  age: '23',
  name: 'John',
  job: 'Software Engineer'
}]);

但报错提示缺少uuid字段。我曾尝试使用jasmine.arrayContaining和jasmine.objectContaining,但可能用法有误,请问如何实现排除UUID的部分属性测试?

解决方案

可以通过以下几种方式实现忽略UUID字段的断言:

方法1:正确嵌套使用jasmine.arrayContaining和jasmine.objectContaining

这两个是Jasmine内置的部分匹配工具,之前的问题大概率是没有正确嵌套使用:

expect(values).toEqual(jasmine.arrayContaining([
  jasmine.objectContaining({
    age: '23',
    name: 'John',
    job: 'Software Engineer'
  })
]));
  • jasmine.objectContaining会自动忽略目标对象中未声明的属性(比如自动生成的uuid),只验证你指定的字段是否匹配
  • jasmine.arrayContaining用于确认数组中至少存在一个符合条件的对象,完全适配你的FormArray新增单条数据的场景

方法2:移除UUID字段后做精确匹配

如果需要严格验证除UUID外的所有字段,可以先从返回数据中删除uuid属性,再执行相等断言:

const [savedItem] = values;
delete savedItem.uuid;
expect(savedItem).toEqual({
  age: '23',
  name: 'John',
  job: 'Software Engineer'
});

这种方式适用于你明确知道FormArray中只有一条新增数据的情况。

方法3:针对服务调用的部分匹配(若通过服务提交数据)

如果组件是调用服务来保存数据,可以直接用jasmine.objectContaining匹配服务方法的参数:

// 先创建mock服务
const mockDataService = jasmine.createSpyObj('DataService', ['addItem']);
// 初始化组件时注入mock服务
component.submitForm();
// 断言服务方法被调用时传入了符合要求的参数
expect(mockDataService.addItem).toHaveBeenCalledWith(
  jasmine.objectContaining({
    age: '23',
    name: 'John',
    job: 'Software Engineer'
  })
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:30:02