Как написать мраморный тест для файла эффекта, который напрямую вызывает HTTP? - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь написать модульный тест для следующего эффекта (отказ от ответственности: я относительно новичок в написании мраморных тестов!):

  markBookAsRead$ = createEffect(() =>
    this.actions$.pipe(
      ofType(ReadingListActions.markBookAsRead),
      optimisticUpdate({
          run: action => {
              return this.http.put(`/api/reading-list/${action.item.bookId}/finished`, { finishedDate: action.item.finishedDate })
              .pipe(
                // With an optimistic update, we initially handle the 'markBookAsRead' action directly in the reducer, hence, no need to dispatch it twice on a successful PUT request!
                  switchMap(() => EMPTY)
              );
          },
          undoAction: action => {
            return ReadingListActions.failedMarkBookAsRead({
              item: action.item
            });
          }
      })
  )
);

Я пробовал следовать из нескольких ответов на Stack Переполнение, однако в большинстве примеров я видел «шпионскую» службу angular, которая запускает HTTP-вызов и возвращает конкретное значение c. В моем коде эффект напрямую вызывает метод http PUT. Я пробовал использовать HTTP Mock, но безуспешно. В приведенном ниже тесте «фактические» данные - это просто пустой массив. Как исправить следующий тест мрамора?

beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [NxModule.forRoot(), SharedTestingModule],
    providers: [
      ReadingListEffects,
      DataPersistence,
      provideMockActions(() => actions),
      provideMockStore({ initialState })
    ]
  });

  effects = TestBed.inject(ReadingListEffects);
  httpMock = TestBed.inject(HttpTestingController);
});


describe('markAsRead$ side effect handling', () => {
  testScheduler = new TestScheduler((actual, expected) => {
    expect(actual).to.equal(expected);
  });

  let actionStream:  Observable<Action>;

  // TO-DO- Fix the following effects Marble test!
  it('should mark book as "finished" with "finishedDate" after successful PUT Request', done => {
      const item = createReadingListItem('Book2');
      const action = ReadingListActions.markBookAsRead({ item });

      testScheduler.run(({ hot, cold, expectObservable }) => {
        actionStream = hot('-a', { a: action });
        const response = cold('-b|', { b: EMPTY });

        // effects.MarkBookAsRead$ below results in an empty array when I execute the test?!
        expectObservable(effects.markBookAsRead$).toBe('--b', { b: response });  
        });
      })
  });
});
...