【问题标题】:Angular Unit Test - Comparison of Array of Objects still fails with toEqual角度单元测试 - 对象数组的比较仍然失败 toEqual
【发布时间】:2021-08-28 04:51:59
【问题描述】:

我很清楚 toBetoEqual 在测试中的区别,所以我认为我的设置会顺利运行,但由于“类型问题”仍然失败.这种简化的设置仍然存在问题:

我的组件看起来像(摘录):

let testVar: Employee[] = [];

...

convertEmpArr(input) {
  const employeeUpd: Employee[] = [];
  employeeUpd.push(new Employee(9999, 'Boss'));
  for (const item of input) {
    employeeUpd.push(new Employee(item.id, item.name));
  }
  this.testVar = employeeUpd;
}

当员工是这样构建时:

export class Employee {
    constructor(public id: number, public name: string) {
    }
}

所以我想检查更新后的数据是否有额外的行 AND 正确的数据。我正在使用模拟数据集:

  it('convertEmpArr - should add Boss and other Employees dynamically', () => {
    const mockEmpIn: Employee[] = [
      {id: 0, name: "Smith"}
    ];
    const mockEmpOut: Employee[] = [
      {id: 9999, name: "Boss"},
      {id: 0, name: "Smith"}
    ];
    component.convertEmpArr(mockEmpIn);
    expect(component.testVar).toEqual(mockEmpOut);
    expect(component.testVar.length).toBe(2);
  }); 

第二个期望工作正常,但第一个期望失败:

Expected $[0] to be a kind of Object, but was Employee({ id: 9999, name: 'Boss' }).
Expected $[1] to be a kind of Object, but was Employee({ id: 0, name: 'Smith' }).

我认为使用 toEqual 正是为了这个用例。使用类似的东西会起作用,但我仍然想知道为什么我的测试在 原始设置 下失败 - 我希望有人可以填写:

expect(JSON.stringify(component.testVar)).toEqual(JSON.stringify(mockEmpIn));

【问题讨论】:

    标签: angular unit-testing jasmine


    【解决方案1】:

    toEqual 对您的断言不起作用的原因是,即使对象 mockEmpOutcomponent.testVar 是“相等的”,它们也不是“相同的”,因为它们表示存在于内存中不同位置的对象。 toEqual 如果对象引用属于内存中的两个不同对象,则返回 false。

    我们写下面的语句的那一刻,它在内存中创建了一个新对象。

    const mockEmpOut: Employee[] = [
          {id: 9999, name: "Boss"},
          {id: 0, name: "Smith"}
        ];
    

    与在测试中声明的mockEmpOut 对象相比,convertEmpArr() 方法中生成的结果对象将始终驻留在不同的内存位置,因为它们在两个不同的位置初始化并且没有任何关系。因此,在这种情况下,toEqual 比较总是返回 false。

    您可以使用您已经提到的 JSON.stringify() 方法,或者您可以断言在结果对象中生成的不同字段的值与您在输入中传递的对象的值相匹配。

    【讨论】:

    • 非常感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多