在Angular / Jasmine测试中多次调用服务的首选方式

时间:2019-07-02 16:46:30

标签: angular jasmine karma-jasmine karma-runner

将尝试简要介绍一下。我的组件从REST端点获取数据。我有一个用于测试的模拟服务,该服务在第二次调用时为我提供了一组不同的数据。

下面的代码中有一些注释。我让它可以进行一项测试,但是却炸毁了另一项测试。我认为在失踪的床单下有一些共享的东西。但这不是这项服务。

组件

getMessages(): void {
  this.myService.getData()
    .subscribe( (data: MyClass) => {
      this.myClass = data;
      // Do all the things to data
      // Do some stuff w/ the ag-grid api
    });
}

onGridReady(params) {
  // store ag-grid api
  this.gridApi = params.api;
}

然后我的测试

beforeEach( () => {
  spyOn(component, 'getMessages').andCallThrough();
});

it('should have data', () => {
  expect(component.myClass).toBeTruthy();
  expect(component.myClass).toEqual('something');

  // All good until here

  // From another answer, but doesn't seem to work:
  // (<jasmine.Spy>component.getMessages).and.callThrough();

  // This works, but blows up another test (makes it throw).
  // Weirdly, they don't share this service. 
  component.getMessages();
  fixture.detectChanges();
  expect(component.myClass).toEqual('somethingElse');
});

然后创建一个不相关的测试文件,如果先前的测试的后三行未注释,出于某种原因该测试文件将开始失败:

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

两个组件都以相同的方式使用和初始化gridApi。两项测试始终通过,直到上述尝试第二次从服务加载数据为止。

第一个失败是未捕获的TypeError(我从ag-grid假定),因为它找不到未定义的setRowData。 (正在尝试this.gridApi.setRowData)。这两个测试具有相同的TestBed配置,并且几乎互相模仿。显然是我设置了一个错误的设置,我想问一下,您是否希望仅通过调用spyOn()函数来实现这种行为?似乎很腥。

0 个答案:

没有答案