Angular 单元测试 - 对象数组的比较仍然因 toEqual 而失败
Angular Unit Test - Comparison of Array of Objects still fails with toEqual
我很清楚 toBe 和 toEqual 在测试中的区别,所以我认为我的设置会 运行 顺利,但由于 'type problems' 仍然失败。这个简化的设置仍然代表问题:
我的组件看起来像(摘录):
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));
toEqual 对您的断言不起作用的原因是,即使对象 mockEmpOut
和 component.testVar
是“相等的”,它们不“相同”,因为它们代表内存中不同位置的对象。 toEqual returns 如果对象引用属于内存中的两个不同对象,则为 false。
当我们写下下面的语句时,它会在内存中创建一个新对象。
const mockEmpOut: Employee[] = [
{id: 9999, name: "Boss"},
{id: 0, name: "Smith"}
];
与测试中声明的 mockEmpOut
对象相比,convertEmpArr()
方法中生成的结果对象将始终驻留在不同的内存位置,因为它们是在两个不同的位置初始化的,而不是以任何方式相关。因此,在这种情况下,toEqual 比较总是 returns 错误。
您可以使用您已经提到的 JSON.stringify() 方法,或者您可以断言结果对象中生成的不同字段的值与您传递的对象的值相匹配在输入中。
我很清楚 toBe 和 toEqual 在测试中的区别,所以我认为我的设置会 运行 顺利,但由于 'type problems' 仍然失败。这个简化的设置仍然代表问题:
我的组件看起来像(摘录):
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));
toEqual 对您的断言不起作用的原因是,即使对象 mockEmpOut
和 component.testVar
是“相等的”,它们不“相同”,因为它们代表内存中不同位置的对象。 toEqual returns 如果对象引用属于内存中的两个不同对象,则为 false。
当我们写下下面的语句时,它会在内存中创建一个新对象。
const mockEmpOut: Employee[] = [
{id: 9999, name: "Boss"},
{id: 0, name: "Smith"}
];
与测试中声明的 mockEmpOut
对象相比,convertEmpArr()
方法中生成的结果对象将始终驻留在不同的内存位置,因为它们是在两个不同的位置初始化的,而不是以任何方式相关。因此,在这种情况下,toEqual 比较总是 returns 错误。
您可以使用您已经提到的 JSON.stringify() 方法,或者您可以断言结果对象中生成的不同字段的值与您传递的对象的值相匹配在输入中。