Angular 8 - модульный тест для абстрактного обслуживания - PullRequest
0 голосов
/ 28 октября 2019

Я должен написать модульный тест для абстрактного сервиса. У нас есть пара каналов 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;
  //...
}

Теперь, прежде чем это было сделано, абстрактное модульное тестирование выполнялось. Как только я изменил его на абстрактный класс, я получаю эту ошибку при попытке запустить should be created test: 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 провайдерам.

1 Ответ

1 голос
/ 28 октября 2019

Он пытается предоставить channelUrl из абстрактного класса, но это, очевидно, не поставщик или InjectionToken.

Вы можете изменить свой сервис для обработки этого:

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

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

И да, всегда полезно тестировать абстрактный класс. Таким образом, вы можете быть уверены, что всякий раз, когда вы его реализуете, он будет действовать одинаково (при правильном тестировании)

...