RxJS / Redux-observables: как бы я протестировал EventEmitter? - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь проверить, запускаются ли избыточные действия, когда запускается событие финиша на моем объекте загрузки.

Вот мой эпос:

const uploadFileEpic = (action$, state$, dependencies$) =>
  action$.pipe(
    ofType(uploadActions.UPLOAD_FILE),
    mergeMap(({ payload }) => {
      const { file, masterHandle } = payload;

      return new Observable(o => {
        const upload = masterHandle.uploadFile("/", file);
        const handle = upload.handle;

        upload.on("finish", () => {
          o.next(
            uploadActions.uploadSuccess({
              masterHandle
            })
          );
          o.complete();
        });
      });
    })
  );

Вот что я написал до сих пор. Это не работает:

import { of } from "rxjs";
import "rxjs/add/operator/toArray";
import { EventEmitter } from "events";

import uploadActions from "../actions/upload-actions";
import uploadEpic from "./upload-epic";

test("uploadFilesEpic filesActions.UPLOAD_FILE on success", done => {
  const file = { name: "f1" };
  const upload = new EventEmitter();
  upload.handle = "h1";

  const masterHandle = {
    uploadFile: jest.fn(() => upload)
  };

  const action$ = of(uploadActions.uploadFile({ file, masterHandle }));

  upload.emit("finish");

  uploadEpic(action$).subscribe(actions => {
    expect(actions).toEqual(uploadActions.uploadSuccess({ masterHandle }));
    done();
  });
});

В нем говорится, что асинхронный обратный вызов не был запущен:

 FAIL  src/redux/epics/upload-epic.test.js (8.531s)
  ✓ uploadFilesEpic filesActions.UPLOAD_FILES (9ms)
  ✕ uploadFilesEpic filesActions.UPLOAD_FILE on success (5021ms)

  ● uploadFilesEpic filesActions.UPLOAD_FILE on success

    Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.Error:

      23 | });
      24 |
    > 25 | test("uploadFilesEpic filesActions.UPLOAD_FILE on success", done => {
         | ^
      26 |   const file = { name: "f1" };
      27 |   const upload = new EventEmitter();
      28 |   upload.handle = "h1";

      at new Spec (node_modules/jest-config/node_modules/jest-jasmine2/build/jasmine/Spec.js:116:22)
      at Object.test (src/redux/epics/upload-epic.test.js:25:1)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 passed, 2 total
Snapshots:   0 total
Time:        9.297s

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

1 Ответ

1 голос
/ 11 июня 2019

Событие для завершения загрузки выдается слишком рано в тесте.EventEmitter не сохраняет буфер событий, и если никто не подписан, то чет теряется.

Переместите emit "finish" в конец теста.

upload.emit("finish"); // must emit after subscribing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...