Angular 8 - 抽象服务的单元测试

Angular 8 - Unit test for abstract service

我应该为抽象服务编写单元测试。我们在应用程序中有几个 SSE 通道,我们创建了要扩展的基本 SSE 服务,它提供了一些基本功能。

export abstract class BaseSseService {
  protected zone: NgZone;

  protected sseChannelUrl: string;

  private eventSource: EventSource;
  private reconnectFrequencySec: number = 1;
  private reconnectTimeout: any;

  constructor(channelUrl: string) {
    const injector = AppInjector.getInjector();
    this.zone = injector.get(NgZone);
    this.sseChannelUrl = channelUrl;
  }

  protected abstract openSseChannel(): void;
  //...
}

现在,在它被抽象化之前,单元测试被运行ning。一旦我将其更改为摘要 class,我在尝试 运行 should be created 测试时遇到此错误:Error: Can't resolve all parameters for TestBaseSseService: (?).

我的测试是这样的:

class TestBaseSseService extends BaseSseService {
  openSseChannel() {
    console.log('Test');
  }
}

fdescribe('BaseSseService', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        TestBaseSseService,
        Injector,
        { provide: String, useValue: "test" }
      ]
    });
    AppInjector.setInjector(TestBed.get(Injector));
  })

  describe(':', () => {
    function setup() {
      return TestBed.get(TestBaseSseService)
    }

    it('should be created', () => {
      const service = setup();
      expect(service).toBeTruthy();
    });
  });  
});

问题是,我是否应该为抽象服务进行单元测试?如果是,如何解决这个问题?如您所见,模拟服务并不能解决这个问题,也不能将 BaseSseService 添加到 TestBed 提供者。

它试图从抽象 class 中提供 channelUrl,但这显然不是提供者或 InjectionToken。

您可以更改您的服务来处理此问题:

class TestBaseSseService extends BaseSseService {
  constructor() {
    super('url');
  }

  openSseChannel() {
    console.log('Test');
  }
}

是的,测试摘要总是好的 class。这样你就可以确定无论何时你实施它,它都会表现得一样(当测试正确时)