【问题标题】:Pipe successfully sorting data but tests are returning incorrect results管道成功排序数据,但测试返回不正确的结果
【发布时间】:2019-08-29 23:38:37
【问题描述】:

我正在使用管道对包含两个日期时间列的 json 数组按升序或降序排序(由布尔值 isDescending 触发,但是单元测试似乎并不关心每个对象在数组。就像在测试中所有 4 种情况都返回 true,即使返回的数组与 dummyData[] 相比应该具有相反顺序的项目。我做错了什么

sortpipe.ts

export class SortByPipe implements PipeTransform {

  transform(data: iRepositories[], args?: ISortByPipe): iRepositories[] {
    if ( !args.column)
    {
      return data;
    }
    return data.sort((a, b) => {
      if (args.isDescendingOrder)
      {
        return a[args.column] > b[args.column] ? -1 : 1;
      }
      else
      {
        return a[args.column] > b[args.column] ? 1 : -1;
      }
    });
  }

}

sortpipe.spec.ts

describe('SortByPipe', () => {

  let pipe: SortByPipe;

  beforeEach(() => {
    pipe =  new SortByPipe();
  });

  const dummyData = [
    { id: 1, created_at: '2014-01-24T13:40:11Z', updated_At: '2015-01-24T13:40:11Z' },
    { id: 2, created_at: '2015-01-24T13:40:11Z', updated_At: '2016-01-24T13:40:11Z' },
    { id: 3, created_at: '2016-01-24T13:40:11Z', updated_At: '2017-01-24T13:40:11Z' },
  ];

  it('create an instance', () => {
     expect(pipe).toBeTruthy();
  });

  // this is correct
  it('should return in the same order as the original data (sort by created_at date)', () => {
    const args: ISortByPipe = {column: 'created_at', isDescendingOrder: false};
    expect(pipe.transform(dummyData, args)).toEqual(dummyData);
  });

  // this is correct 
  it('should return in the same order as the original data (sort by last commit date)', () => {
    const args: ISortByPipe = {column: 'updated_At', isDescendingOrder: false};
    expect(pipe.transform(dummyData, args)).toEqual(dummyData);
  });


  // this should be false but its returning true
  it('should return in descending order (sort by created_at date)', () => {
    const args: ISortByPipe = {column: 'created_at', isDescendingOrder: true};
    expect(pipe.transform(dummyData, args)).toEqual(dummyData);
  });

  // this should be false but its returning true
  it('should return in descending order (sort by last commit date)', () => {
    const args: ISortByPipe = {column: 'updated_At', isDescendingOrder: true};
    expect(pipe.transform(dummyData, args)).toEqual(dummyData);
  });
})

【问题讨论】:

    标签: angular karma-jasmine


    【解决方案1】:

    Array.prototype.sortin-place 进行排序,因此它对您传入的数组进行排序。为了方便,它返回相同的数组,但它不会复制输入。这意味着,在您调用转换后,dummyData 的顺序已更改。您应该在管道中复制一份以确保其安全。

    【讨论】:

      【解决方案2】:

      这样试试

      let sortarray = [...data];
      sortarray = sortarray.sort((a, b) => {
            if (args.isDescendingOrder)
            {
              return a[args.column] > b[args.column] ? -1 : 1;
            }
            else
            {
              return a[args.column] > b[args.column] ? 1 : -1;
            }
          });
      return sortarray;
      

      【讨论】:

        猜你喜欢
        • 2021-10-09
        • 2017-11-28
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-05
        相关资源
        最近更新 更多