Как запустить ngxsAfter Bootstrap в модульных тестах jasmine? - PullRequest
0 голосов
/ 13 июля 2020

В своем приложении angular я использую NGXS и Jasmine.

В некоторых из моих магазинов я использую ngxsAfter Bootstrap в качестве инициализации, при которой я отправляю некоторые действия.

Я не могу используйте ngxsOnInit, потому что не знаю точно, почему, но я не могу получить свои актуальные параметры URL-адреса из моих селекторов RouteState (всегда undefined в ngxsOnInit, даже когда я подписываюсь на эти селекторы и жду некоторое время)

Но с ngxsAfter Bootstrap я получаю эти значения.

Итак, в своих модульных тестах я хочу проверить эту инициализацию, но я не нашел никакого решения для запуска ngxsAfter Bootstrap method.

Согласно документации NGXS (https://www.ngxs.io/advanced/life-cycle), ngxsAfter Bootstrap будет запускаться через APP_BOOTSTRAP_LISTENER, поэтому я думаю, что это когда мы используем свойство 'bootstrap' из ngModule, которого нет в TestBed.configureTestingModule ...

Я попытался получить экземпляр своего хранилища, вызвать вручную его метод ngxsAfter Bootstrap с имитацией StateContext в качестве аргумента, но очевидно, что он стал ause StateContext высмеян, он не запускает мои действия, когда я использую его отправку ...

Знаете ли вы какое-нибудь "чистое" решение по этому поводу? (чистый, здесь, просто чтобы не изменять мою реализацию, чтобы заставить модульный тест работать)

Thx! (извините за мой плохой английский sh)

РЕДАКТИРОВАТЬ:

Что я наконец сделал:

productStore = TestBed.inject(ProductState);

...

const stateContextMocked = {
      getState: jasmine.createSpy(),
      setState: jasmine.createSpy(),
      patchState: jasmine.createSpy(),
      dispatch: jasmine.createSpy(),
} as StateContext<IProduct>;

 ...

productStore.ngxsAfterBootstrap(stateContextMocked);

...

expect(stateContextMocked.dispatch).toHaveBeenCalledWith(new GetProductAction(productIdMocked));

Я пытался сделать это раньше, но не сделал нравится, потому что я не мог использовать «настоящий» объект StateContext, который автоматически передается в аргументе ngxsAfter Bootstrap.

Итак, я не смог получить результат моей отправки.

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

Это даже лучший подход ^^

1 Ответ

0 голосов
/ 13 июля 2020

Допустим, мы хотим протестировать ngOnInit.

  1. На этапе // Arrange теста мы имитируем все внешние зависимости, включая методы компонентов publi c (методы компонентов не являются обязательными для Кстати, это зависит от нашего подхода).
  2. Затем в // Act мы запускаем ngOnInit, просто вызывая
component.ngOnInit();
И, наконец, в // Assert мы ожидаем, что наши шпионы были вызваны.

Тот же подход с ngxsAfterBootstrap, вы должны рассматривать его как простой метод класса. Не нужно слишком усложнять.

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