将尝试简要介绍一下。我的组件从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()函数来实现这种行为?似乎很腥。