Тестирование жасмина службы закусочной Angular

Я хочу попробовать жасмин в закусочной. Более конкретно, я тестирую следующие два случая:

  1. Что сервис создан
  2. Метод внутри него, который будет вызываться

закусочная.обслуживание

import { Injectable, NgZone } from '@angular/core';
import { MatSnackBar } from '@angular/material';

@Injectable({
  providedIn: 'root'
})
export class SnackbarService {

  constructor(
    public snackBar: MatSnackBar,
    private zone: NgZone
  ) { }

  public open(message, action, duration = 1000) {
    this.zone.run(() => {
      this.snackBar.open(message, action, { duration });
    })
  }
}

закусочная.service.spec

import { TestBed } from '@angular/core/testing';
import { SnackbarService } from './snackbar.service';

describe('SnackbarService', () => {
  beforeEach(() => TestBed.configureTestingModule({}));

  it('should be created', () => {
    const service: SnackbarService = TestBed.get(SnackbarService);
    expect(service).toBeTruthy();
  });

  it('should call open()', () => {
    const service: SnackbarService = TestBed.get(SnackbarService);
    const spy = spyOn(service, 'open');
    service.open('Hello', 'X', 1000);
    expect(spy).toHaveBeenCalled();
  })
});

После запуска тестов Karma выдает следующие ошибки:

  1. SnackbarService > должен вызывать open() NullInjectorError: StaticInjectorError(DynamicTestModule)[MatSnackBar]: StaticInjectorError(Platform: core)[MatSnackBar]: NullInjectorError: Нет провайдера для MatSnackBar!
  2. SnackbarService> должен быть создан NullInjectorError: StaticInjectorError(DynamicTestModule)[MatSnackBar]: StaticInjectorError(Platform: core)[MatSnackBar]: NullInjectorError: Нет провайдера для MatSnackBar!

Любые идеи о том, как мне исправить эту проблему?

Спасибо!


person blk    schedule 19.03.2020    source источник


Ответы (1)


Да, вы должны импортировать и предоставить то, что необходимо.

import { TestBed } from '@angular/core/testing';
import { SnackbarService } from './snackbar.service';
import { MatSnackBarModule } from '@angular/material/snack-bar';

describe('SnackbarService', () => {
  let zone: NgZone;
  let snackBar: MatSnackBar;
  beforeEach(() => TestBed.configureTestingModule({
     imports: [MatSnackBarModule],
     providers: [
       SnackbarService,
       NgZone,
     ],
  }));

  beforeEach(() => {
    // if you're on Angular 9, .get should be .inject
    zone = TestBed.get(NgZone);
    spyOn(zone, 'run').and.callFake((fn: Function) => fn());
    snackBar = TestBed.get(MatSnackBar);
  });

  it('should be created', () => {
    const service: SnackbarService = TestBed.get(SnackbarService);
    expect(service).toBeTruthy();
  });

  // the way you have written this test, it asserts nothing
  it('should call open()', () => {
    const service: SnackbarService = TestBed.get(SnackbarService);
    // const spy = spyOn(service, 'open');
    const spy = spyOn(snackBar, 'open');
    service.open('Hello', 'X', 1000);
    expect(spy).toHaveBeenCalled();
  })
});

Я никогда не проводил модульное тестирование чего-либо, требующего NgZone, но изучите это, если у вас возникнут проблемы (Запуск тестов jasmine для компонента с зависимостью от NgZone).

person AliF50    schedule 19.03.2020
comment
Спасибо за вашу помощь! Я сделал, как вы сказали, и снова провел тесты. Эта ошибка выскочила: Ошибка: Не удается разрешить все параметры для NgZone: (?). Затем я попытался исправить это с помощью ссылки, которой вы поделились. К сожалению, не повезло. - person blk; 19.03.2020
comment
Удалось исправить! Я удалил ngZone из своего сервиса, и мне больше не нужно об этом беспокоиться. - person blk; 19.03.2020