Я пытаюсь написать модульный тест для следующего эффекта (отказ от ответственности: я относительно новичок в написании мраморных тестов!):
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 });
});
})
});
});