测试在Jasmine中具有构造函数方法的Angular2 Pipe

Jon*_*tes 5 unit-testing jasmine typescript karma-jasmine angular

我正在尝试测试具有构造函数的Angular Pipe的第一个障碍。

我的管道如下:

反向管道

import {
  IterableDiffer,
  IterableDiffers,
  Pipe,
  PipeTransform
} from '@angular/core';

@Pipe({
  name: 'reverse',
  pure: false
})
export class ReversePipe implements PipeTransform {

  private cached: Array<any>;
  private differ: IterableDiffer<Array<any>>;

  constructor(private differs: IterableDiffers) {
    this.differ = this.differs.find([]).create(null);
  }

  transform(array: Array<any>): Array<any> {
    // TODO: Throw an error if `array` isn't an Array
    if (Array.isArray(array) === false) return [];

    const changes = this.differ.diff(array);

    if (changes) this.cached = array.slice().reverse();

    return this.cached;
  }
}
Run Code Online (Sandbox Code Playgroud)

我相信通过几本教程,使用IterableDiffer效率是正确的。但这不是这个问题的主题。

我认为需要构造函数的事实是此简单测试失败的根源:

反向管道规格

import { ReversePipe } from './reverse.pipe';

describe('ReversePipe', () => {
  it('create an instance', () => {
    const pipe = new ReversePipe();
    expect(pipe).toBeTruthy();
  });
});
Run Code Online (Sandbox Code Playgroud)

测试失败,并显示以下错误: TypeError: Cannot read property 'find' of undefined

我(可能是错误地)认为这是因为differs需要在测试中注入错误消息,提示它是undefined

我的路线正确吗?如何为Pipe写一个简单的测试?

更新资料

我试图注入IterableDiffers正在测试的管道中;虽然已经纠正了以前的错误,但我没有遇到新的错误Error: Can't resolve all parameters for IterableDiffers: (?).

在终端中,显示错误Cannot invoke an expression whose type lacks a call signature. Type 'IterableDiffers' has no compatible call signatures.

两者都只是用不同的语言描述相同的问题。

我更新的测试是:

反向管道规格

import { IterableDiffer, IterableDiffers } from '@angular/core';
import { TestBed, inject } from '@angular/core/testing';

import { ReversePipe } from './reverse.pipe';

describe('ReversePipe', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [IterableDiffers]
    });
  });

  // it('create an instance', () => {
  //   const array = [ 1, 2, 3 ];
  //   const pipe = new ReversePipe(new IterableDiffers);
  //   expect(pipe).toBeTruthy();
  // });

  it('create an instance', inject([IterableDiffers], (iterableDiffers: IterableDiffers) => {
    const array = [ 1, 2, 3 ];
    const pipe = new ReversePipe(iterableDiffers);

    expect(pipe).toBeTruthy();
  }));
});
Run Code Online (Sandbox Code Playgroud)

任何帮助都将不胜感激。

Jon*_*tes 5

我的更新测试非常接近。您不需要提供IterableDiffers

反向管道规格

import { IterableDiffers } from '@angular/core';
import { TestBed, inject } from '@angular/core/testing';

import { ReversePipe } from './reverse.pipe';

describe('ReversePipe', () => {
  it('should create an instance', inject([ IterableDiffers ], (iterableDiffers: IterableDiffers) => {
    const pipe = new ReversePipe(iterableDiffers);

    expect(pipe).toBeTruthy();
  }));

  it('should reverse the array of type Array<number>', inject([ IterableDiffers ], (iterableDiffers: IterableDiffers) => {
    const array = [ 1, 2, 3 ];
    const pipe = new ReversePipe(iterableDiffers);

    expect(pipe.transform(array)).toEqual([ 3, 2, 1 ]);
  }));

  it('should reverse the array of type Array<string>', inject([ IterableDiffers ], (iterableDiffers: IterableDiffers) => {
    const array = [ 'apple', 'banana', 'clementine' ];
    const pipe = new ReversePipe(iterableDiffers);

    expect(pipe.transform(array)).toEqual([ 'clementine', 'banana', 'apple' ]);
  }));
});
Run Code Online (Sandbox Code Playgroud)

我还注意到我在以下地方有一个不必要的if陈述reverse.pipe.spec.ts

// TODO: Throw an error if `array` isn't an Array
if (Array.isArray(array) === false) return [];
Run Code Online (Sandbox Code Playgroud)

的第一个参数transform始终为Array;当然,TypeError如果参数不是,TypeScript编译器将抛出Array

为了完整起见,我的管道是:

反向管道

import {
  IterableDiffer,
  IterableDiffers,
  Pipe,
  PipeTransform
} from '@angular/core';

@Pipe({
  name: 'reverse',
  pure: false
})
export class ReversePipe implements PipeTransform {

  private cached: Array<any>;
  private differ: IterableDiffer<Array<any>>;

  constructor(private differs: IterableDiffers) {
    this.differ = this.differs.find([]).create(null);
  }

  public transform(array: Array<any>): Array<any> {
    const changes = this.differ.diff(array);

    if (changes) this.cached = array.slice().reverse();

    return this.cached;
  }
}
Run Code Online (Sandbox Code Playgroud)