如何用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
相关产品推荐
相关产品推荐

