Angular:自定义管道的测试用例

Angular: TestCase For Custom Pipe

我是单元测试的新手,我需要帮助在 karma 中为 Sort Pipe 编写测试用例。我的自定义排序管道正在调用基于方向值的方法,其中排序逻辑是。

@Pipe({
  name: 'sortBy'
})
export class SortByPipe implements PipeTransform {
transform(value[], direction:string){

    if (direction === 'desc'){
      this.descendingSort(value);
    }
    else if(direction === 'asc'){
      this.ascendingSort(value);
    }
    return value;
  }      

第一种情况:想检查是否是基于方向值调用正确的方法。

第二种情况:查看排序结果

我试着为第二种情况写这样的东西。

    const direction = 'asc';
    const pipe = new SortByPipe();
    const result = pipe.transform([4,3,2,1], direction);
    expect(result).toBe([1,2,3,4]);

请帮助我了解如何解决它。 提前致谢

我认为这个问题有两个答案:

  1. 检查调用的方法

您可以使用 Jasmine Spies (https://jasmine.github.io/api/edge/Spy.html) 在 Jasmine 中进行间谍活动。这允许您有点像进入某个方法并修改它,例如返回模拟值等。它还跟踪调用该方法的次数:

const direction = 'asc';
const pipe = new SortByPipe();
spyOn(pipe, 'ascendingSort')

const result = pipe.transform([4,3,2,1], direction);

expect(result).toBe([1,2,3,4]);
expect(pipe.ascendingSort).toHaveBeenCalledTimes(1);
  1. 不关心函数的内部工作原理,而是关心输入和输出

上升和下降函数是转换函数实现的一部分(如果没有在其他地方使用)所以函数内部发生的事情并不重要。重要的是输入和预期输出是什么。因此,要测试这样的案例,您只需测试两个用例:

it('should sort in ascending order', () => {
    const pipe = new SortByPipe();
    const result = pipe.transform([4,3,2,1], 'desc');

    expect(result).toBe([1,2,3,4]);
})
  
it('should sort in descending order', () => {
    const pipe = new SortByPipe();
    const result = pipe.transform([1,2,3,4], 'asc');

    expect(result).toBe([4,3,2,1]);
})

你真的不关心测试中发生了什么。如果您决定在转换函数中从两个函数更改为 this.sort(value, direction) 之类的函数,那么您不想修复测试。但是,如果您仍然认为应该测试内部功能,那么这是一个很好的指标,表明您的功能正在做太多事情。因此,在那种情况下,将其分解为更小的函数并为这些函数编写单独的测试以保持测试隔离。

您可以使用 SCURi 编写覆盖率高达 70% 的自动化单元测试

How to write unit test cases automatically using SCURI in angular 8 onwards