Модульное тестирование самой услуги в Angular с вызовом SnackBar - PullRequest
0 голосов
/ 08 мая 2020

Я относительно новичок в Angular модульном тестировании материалов, а также в модульном тестировании услуг. Я создал сервис для своего приложения, с помощью которого я могу вызвать функцию открытия Material SnackBar и передать через нее параметр сообщения. Он отлично работает в каждом компоненте, когда это необходимо, но модульное тестирование для меня это что-то ... ужасное для меня. *

Мой вопрос будет следующим:

  1. Почему в моем покрытии кармы говорится, что метод openSnackBar (message) не протестирован? Я имею в виду, по крайней мере, я тестирую, является ли это функцией или нет.
  2. Как я могу на самом деле протестировать такую ​​службу самостоятельно?

Заранее спасибо.

1 Ответ

2 голосов
/ 12 мая 2020

Хорошо, я решил это с небольшой помощью друга. Первая проблема заключается в том, что в моем конструкторе я определяю частную, а не публикуемую c версию SnackBar (private sb: MatSnackBar -> public sb: MatSnackBar). Во-вторых, я немного изменил тестовый файл, и теперь он выглядит вот так и работает нормально:

import { Overlay } from '@angular/cdk/overlay';
import { TestBed } from '@angular/core/testing';
import { MatSnackBar, MatSnackBarModule, MatSnackBarConfig } from '@angular/material/snack-bar';
import { createServiceFactory, SpectatorService } from '@ngneat/spectator';
import { NotificationService } from './notification-service';

describe('NotificationService testing:', () => {
  let spectator: SpectatorService<NotificationService>;
  let snackBar: MatSnackBar;
  let snackBarConfig: MatSnackBarConfig;

  const createService = createServiceFactory({
    service: NotificationService,
    imports: [MatSnackBarModule],
    providers: [MatSnackBarModule, Overlay],
    entryComponents: [],
    mocks: [NotificationService],
  });

  beforeEach(() => {
    TestBed.configureTestingModule({});
    snackBar = TestBed.inject(MatSnackBar);
    spectator = createService();
  });

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

  it('should openSnackBar() be known as function', () => {
    expect(typeof spectator.service.openSnackBar).toEqual('function');
  });

  it(`should openSnackBar() call SnackBar's own open()`, () => {
    const service: NotificationService = TestBed.inject(NotificationService);
    snackBarConfig = new MatSnackBarConfig();
    snackBarConfig.duration = parseInt('5000', 0);
    const serviceSpy = spyOn(service, 'openSnackBar').and.callThrough();
    const snackSpy = spyOn(snackBar, 'open');
    expect(serviceSpy).not.toHaveBeenCalled();
    expect(snackSpy).not.toHaveBeenCalled();
    service.openSnackBar('Hello');
    expect(serviceSpy).toHaveBeenCalledWith('Hello');
    expect(snackSpy).toHaveBeenCalledWith('Hello', 'Dismiss', snackBarConfig);
  });
});

Надеюсь, это поможет, если кто-то будет бороться с той же проблемой в будущем. Также я уверен, что есть лучший и лучший способ сделать это, но сейчас он работает и дает 100% покрытие, что имеет значение. Но мы будем тепло приветствовать предложения по модификации в будущем этого.

...