Как внедрить сервисы в пользовательский класс в тесте beforeEach Karma/Jasmine в Angular 7?

Привет, я пытаюсь протестировать экземпляр пользовательского класса, у меня есть несколько тестов в одном и том же файле спецификации, поэтому я использую метод beforeEach, также я использую метод inject для получения услуг, необходимых моему классу, но когда я запускаю тест вар appointmentCreationVehicle не определены это мой код:

describe('AppointmentCreationVehicle', () => {
  let appointmentCreationVehicle: AppointmentCreationVehicle;

  beforeAll(() => {
    TestBed.configureTestingModule({
      imports: [AppModule]
    })
    .compileComponents();
  });

  beforeEach(
    inject([AppointmentCreationVehicle], (vehicleRestService: VehicleRestService) => {
      appointmentCreationVehicle = new AppointmentCreationVehicle(vehicleRestService);
    })
  );
  it('should create an instance',() => {
      expect(appointmentCreationVehicle).toBeTruthy();
  });

тогда мой karma.conf.js выглядит так:

module.exports = function (config) {
    config.set({
        basePath: '',
        frameworks: ['jasmine', '@angular-devkit/build-angular'], 
        plugins: [
            require('karma-jasmine'),
            require('karma-firefox-launcher'),
            require('karma-mocha-reporter'),
            require('@angular-devkit/build-angular/plugins/karma')
        ],
        client: {
            clearContext: false, // leave Jasmine Spec Runner output visible in browser
            jasmine: {
                random: false
            },            
            captureConsole: true,
            mocha: {
                bail: true
            }        
        },
        reporters: ['mocha'],
        port: 9876,
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: false,
        browsers: ['HeadlessFirefox'],
        singleRun: true,
        customLaunchers: {
            HeadlessFirefox: {
                base: 'Firefox',
                flags: ['-headless']
            },
            ChromeDebugging: {
                base: 'Chrome',
                flags: ['--remote-debugging-port=9876']
            }
        }
    });
};

Возможно ли, что инъекция сервисов заканчивается после их выполнения? Если я покажу, как я могу избежать этого поведения.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
154
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не импортировали провайдеров в свой тестовый стенд:

beforeAll(() => {
  TestBed.configureTestingModule({
    providers: [...] // <---------- HERE
  })
  .compileComponents();
});

После этого сделайте проще: используйте тестовый стенд! Он содержит weekMap зависимостей:

const myServiceInstance = TestBed.get(MyService);

у меня есть провайдеры в моем AppModule. Нужно импортировать с TestBed?

Ernesto Alfonso 29.05.2019 13:41

@ErnestoAlfonso, возможно, вам следует прочитать документация перед тестированием ...

user4676340 29.05.2019 13:45

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

user4676340 29.05.2019 13:45

TestBed.configureTestingModule создает модуль для тестирования, он работает как другие модули с импортом, провайдерами и т. д., если я импортирую модуль в TestingModule, он будет работать так же, как когда я делаю то же самое в одном из моих модулей приложения.

Ernesto Alfonso 29.05.2019 13:58

Вот о чем я говорю, вы вообще не знакомы с концепцией модульного тестирования. Потратьте некоторое время, прочитайте документацию, и вы поймете свои ошибки.

user4676340 29.05.2019 13:59

Я думаю, что начинаю понимать, что вы говорите, вы говорите, что модульный тест не может включать внешний элемент, а только элементы, необходимые элементу, который вы тестируете?

Ernesto Alfonso 29.05.2019 14:05

@ErnestoAlfonso вау, ты быстро читаешь! Действительно, модульные тесты касаются отдельных модулей. На самом деле я только что ответил на аналогичный вопрос о принципах модульного тестирования, если вам нужны основные концепции.

user4676340 29.05.2019 14:07

@ErnestoAlfonso хорошо документация, но пожалуйста!

user4676340 29.05.2019 14:09

Другие вопросы по теме