当我不关心依赖关系时,如何对角度2组件进行单元测试?我只是想测试一些内部函数

时间:2016-09-21 16:59:03

标签: unit-testing angular karma-jasmine

我是编写单元测试的新手,不幸的是,我已经构建了一些复杂的" (对我而言)我很难开始编写测试的组件。

这是我的代码片段,包括构造函数。基本上,我现在并不关心这些依赖关系,我想测试一些内部函数,比如根据数组大小调整大小等等。对于这些,我可以创建一个Array.fill并且应该很好

export class GalleryComponent implements OnInit {

  photos = [];

  galleryState: Observable<any>;

  constructor(
    private store: Store<any>,
    private photoActions: PhotoActions,
    private router: Router
  ) {
    this.galleryState = this.store.select<any>(state => state.photos.gallery);
  }
}

在构造函数中没有任何内容的其他组件中,在我的测试中实例化组件就像new SomeComponent()一样简单。

然而,在上面的GalleryComponent中,我想知道是否有一种方法可以完全忽略依赖关系(现在),而只是以我可以测试一些内部的方式实例化组件功能很容易。例如,假设我在GalleryComponent中有以下功能:

function timesByTwo(number) {
  return number * 2;
}

这与任何依赖项都没有关系,所以我如何只测试一个函数,因为该组件有3个依赖项?

由于

1 个答案:

答案 0 :(得分:2)

如果您真的不关心与依赖项相关的任何测试,那么在您的规范中,您可以构建具有这些依赖项的空值的组件。

import { AppComponent } from './app.component';
describe('App: Test', () => {

  let component: AppComponent;

  beforeEach(() => {
    component = new AppComponent(null, null, null);
  });

  it('should create the app', () => {
    expect(component).toBeTruthy();
  });

  it(`Should return 4`, () => {
    expect(component.timesByTwo(2)).toEqual(4);
  });
}

要在构造函数中绕过this.store.select的当前用法,可以像这样修改构造函数

constructor(
    private store: Store<any>,
    private photoActions: PhotoActions,
    private router: Router
  ) {
    if(this.store == null){
        this.galleryState = null;
    }else{
        this.galleryState = this.store.select<any>(state => state.photos.gallery);
    }
  }

否则,您可以在测试页面中模拟Store组件。一个例子

import { Observable } from 'rxjs/Rx'
export class MockService extends EventService{

  constructor() { super(null); }

  getEvents(user:string){
    return Observable.of([{val: "test"}]);
  }
}

然后将上面的代码修改为

let component: AppComponent;
let mockService: MockService;

      beforeEach(() => {
        mockService = new MockService()
        component = new AppComponent(null, mockService, null);
      });