RxJS/Redux可观察对象:我将如何测试EventEmitter?

RxJS/Redux可观察对象:我将如何测试EventEmitter?,rxjs,redux-observable,Rxjs,Redux Observable,我试图测试在我的上传对象上的finish事件被触发时是否触发了redux操作 这是我的史诗: const uploadFileEpic = (action$, state$, dependencies$) => action$.pipe( ofType(uploadActions.UPLOAD_FILE), mergeMap(({ payload }) => { const { file, masterHandle } = payload;

我试图测试在我的上传对象上的finish事件被触发时是否触发了redux操作

这是我的史诗:

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

对我来说,测试失败是有道理的,但我不确定如何订阅epic,启动
finish
事件,然后检查epic返回的操作。

完成上传的事件在测试中发出得太早。
EventEmitter
不保留事件缓冲区,如果没有人订阅,则偶数丢失

将emit
“finish”
移动到测试的底部

upload.emit("finish"); // must emit after subscribing

尝试将
upload.emit(“finish”)
移动到测试的底部。@Reactgular哇,真是太棒了!