Невозможно протестировать сервис Angular с параметром конструктора консоли - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь реализовать службу регистрации, как подразумевает служба имен. Конкретная реализация службы регистрации будет решена во время инициализации. Эта конкретная реализация использует консоль для регистрации сообщений. Мне нужно Console в конструкторе, чтобы можно было его смоделировать, не затрагивая глобальный console объект.

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

Я пытаюсь внедрить интерфейс консоли в мою службу Angular, например:

export class ConsoleLoggerService implements LoggerService {
   constructor(public console: Console) { }
}

Когда я пытаюсь запустить свой тест:

describe('ConsoleLoggerService', () => {
  let service: ConsoleLoggerService;
  let consoleMock: Console;

  beforeEach(async(() => {
    consoleMock = {
      log(message?: any, ...optionalParams: any[]) { }
    } as Console;
    service = new ConsoleLoggerService(consoleMock);
  }));
  it('should be created', () => {
    expect(service).toBeTruthy();
  });
});

я получаю эту ошибку

  ● Test suite failed to run

    ReferenceError: Console is not defined

       9 | export class ConsoleLoggerService implements LoggerService {
      10 |
    > 11 |   constructor(public console: Console) { }
         |                               ^

В моем понимании интерфейс Console происходит от @types/node и должен быть доступны по всему миру. Почему мой тест проваливается?

Я использую Angular 9, Jest 24.9 и Nx 9 для своей рабочей области.

1 Ответ

1 голос
/ 26 марта 2020

Если вы хотите проверить, что журнал консоли был нажат, используйте jest, чтобы смоделировать его. В своем тесте вы могли бы сделать что-то вроде этого:

it('console.log the text "hello"', () => {
  console.log = jest.fn();

  // call some function here that will end up doing your logging

  // The first argument of the first call to the function was 'hello'
  expect(console.log.mock.calls[0][0]).toBe('hello');
});

Если вы просто вводите его таким образом, для целей тестирования, я бы рекомендовал просто использовать jest для насмешки, как указано выше.

Если Вы должны продолжать вводить его так, чтобы использовать тестовый стенд для предоставления поддельного поставщика:

beforeEach(() => {
    TestBed.configureTestingModule({
        // MockConsole would be some fake class that you create
        providers: [{provide: Console, useClass: MockConsole }]
    });
    service = TestBed.get(CgonsoleLoggerService);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...