对从方法调用的方法进行单元测试

Unit test a method called from a method

我有一个 angular 应用程序和一个点击时触发的方法。在这个方法中,我将一个值传递给另一个私有方法。

.ts 文件

public onViewItem(item: Results): void {
    const ids = [item.data['id']];
    this.anotherMethod(ids);
}

.spec 文件

it('should trigger a method on view item', () => {
    component.onViewItem(documents[0]);
    expect(component.onViewItem).toHaveBeenCalled();
});

如何测试线路 const ids = [item.data['id']]; 并检查 this.anotherMethod(ids);

的调用

您必须监视要确保参数的方法。

spyOn(NameOfTheComponent, 'anotherMethod')
expect(NameOfTheComponent.anotherMethod).toHaveBeenCalledWith([IDEXPECTED])

有一个很好的做法:检查预期结果,避免检查中间调用了哪个方法。这将使测试易于维护。

让我们用一个例子来探索它。

public onViewItem(item: Results): void {
    const ids = [item.data['id']];
    this.anotherMethod(ids);
}
public anotherMethod(ids: number[]): void {
    this.ids = ids;
}

有哪些测试选项?我看到两个:

差一个

监视 anotherMethod:

it('should trigger a method on view item', () => {
    spyOn(NameOfTheComponent, 'anotherMethod')
    
    component.onViewItem(documents[0]);

    expect(component.anotherMethod).toHaveBeenCalledWith([documents[0].id]);
});

好一个

测试预期结果:

it('should trigger a method on view item', () => {
    spyOn(NameOfTheComponent, 'anotherMethod')
    
    component.onViewItem(documents[0]);

    expect(component.ids).toEqual([documents[0].id]);
});

为什么好的更好?假设您重构了 onViewItem 方法。现在看起来像这样:

public onViewItem(item: Results): void {
    const ids = [item.data['id']];
    this.ids = ids;
}

论据相同。方法执行产生的结果也完全相同。如果你有一个函数的间谍,你将被迫重构测试。如果您刚刚测试了预期的结果 - 您就可以开始了。