Я хочу повторно использовать часть списка поставщиков в нескольких модульных тестах Angular - PullRequest
0 голосов
/ 02 мая 2019

Я довольно новичок в Angular / Typescript. И так как я запускаю новое приложение, я также погружаюсь в модульное тестирование компонентов и сервисов. Большинство моих компонентов используют DI для сервисов. При тестировании этих компонентов мне нужно не только предоставить имитационный сервис, например, для моего UserService, но и предоставить классы для всех зависимостей, которые использует UserService. У меня это работает, но я повторно использую список провайдеров opf в нескольких файлах Unit Test. Как программист мне это не нравится, и я хотел бы повторно использовать (часть) этого списка, хотя бы сказать константу.

Код ниже - это то, что я использую. Моя проблема касается провайдеров: []. Большинство из них необходимы для каждой спецификации, за исключением нескольких услуг.

describe('HeaderMenuComponent', () => {
  let component: HeaderMenuComponent;
  let fixture: ComponentFixture<HeaderMenuComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [HeaderMenuComponent],
      imports: [
        CookieModule.forRoot(),
        HttpClientModule,
        HttpModule,
        RouterTestingModule
      ],
      providers: [CookieService, CookieModule, CookieOptionsProvider, BaseService, AuthenticationService,
        { provide: XHRBackend, useClass: MockBackend },
        { provide: ConfigurationService, useClass: ConfigurationMockService },
        { provide: UserService, useClass: UserMockService },
        {
          // Here we request that configuration loading be done at app-
          // initialization time (prior to rendering)
          provide: APP_INITIALIZER,
          useFactory: (configService: ConfigurationService) =>
            () => configService.loadConfigurationData(),
          deps: [ConfigurationService],
          multi: true
        },
        { provide: 'BASE_URL', useFactory: '', deps: [] }]
    })
      .compileComponents();
  }));

Мне бы хотелось, чтобы код выглядел примерно так, где DefaultProvidersList содержит провайдеров, повторно используемых в нескольких тестах, а также Сервисы 1 и 2, специфичные для текущего файла .:

providers: [DefaultProvidersList, Service1, Service2]

1 Ответ

0 голосов
/ 14 мая 2019

Я придумал, как это сделать. Не уверен, что это правильно в стиле кода, но он выполняет свою работу.

Я создал файл с именем unittest.ext.ts, класс в нем и две функции, getImports () и getProviders. Смотрите ниже, надеюсь, это поможет кому-то. Если у кого-то есть идея получше, дайте мне знать.

export const UnitTestExtensions = {
  hasClass: function (element, cls) {
    var classes = element.getAttribute('class');
    var split = classes.split(' ');
    return split.indexOf(cls) !== -1;
  },
   getProviders: function () {
     return [UtilityService, CookieService, CookieModule, CookieOptionsProvider, BaseService, HeaderService, LoadingService,
       { provide: XHRBackend, useClass: MockBackend },
       { provide: ConfigurationService, useClass: ConfigurationMockService },
       { provide: UserService, useClass: UserMockService },
       { provide: AuthenticationService, useClass: AuthenticationMockService },
       {
         // Here we request that configuration loading be done at app-
         // initialization time (prior to rendering)
         provide: APP_INITIALIZER,
         useFactory: (configService: ConfigurationService) =>
           () => configService.loadConfigurationData(),
         deps: [ConfigurationService],
         multi: true
       },
       { provide: 'BASE_URL', useFactory: '', deps: [] }];
  },

  getImports: function () {
    return [FormsModule,
      RouterTestingModule,
      CookieModule.forRoot(),
      HttpClientModule,
      HttpModule];
  }

};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...