RxJS/Redux可观察对象:我将如何测试EventEmitter?
我试图测试在我的上传对象上的finish事件被触发时是否触发了redux操作 这是我的史诗: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;
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哇,真是太棒了!