1

次のredux-observable叙事詩を持つ:

export const mouseEventEpic = (action$, store) =>
	action$
		::filter(action => action.type === MOUSE_OUT || action.type === MOUSE_OVER)
		::debounceTime(200)
		::map(action => getMappedAction(action, store));

const getMappedAction = (action, store) => {
	switch (action.type) {
      case MOUSE_OVER:
        return {type: "OVER"};
      case MOUSE_OUT:
        return {type: "OUT"};
	}
};

そして次のテスト

import { expect } from 'chai';
import configureMockStore from 'redux-mock-store';
import { createEpicMiddleware } from 'redux-observable';
import { mouseEventEpic } from '...';
    
const epicMiddleware = createEpicMiddleware(mouseEventEpic );
const mockStore = configureMockStore([epicMiddleware]);

describe('Epic...', () => {
	let store;

	beforeEach(() => {
		store = mockStore({});
	});

	it('test...', () => {    
		store.dispatch({type:'MOUSE_OVER'});    
		expect(store.getActions()).to.deep.equal([]);
	});
});

store.getActions() は、「MOUSE_OVER」という 1 つのアクションを含む配列を返します。一方、デバウンスを削除すると、別の(および予想される)アクション「OVER」が返されます。
テストでデバウンス演算子をスタブ/削除したいと思います。sinon スタブ関数を使用してこのリンクのアイデアをたどろうとしましたが、成功しませんでした。
RxJS オペレーターまたは具体的にはデバウンス/スロットルをモックする方法に関するいくつかのガイドラインをいただければ幸いです。
React、Mocha、Chai、Enzyme を使用して...

ありがとう

4

2 に答える 2

0

私の2回目の試み。呼び出されなかったスタブは、おそらくまだ呼び出されているように見えます (もしあったとしても) しばらくしてから。ここでも、::debounceTime(200) 行を削除すると、すべて正常に機能します。

let sandbox, debounceTime, epicMiddleware, mockStore, store;

beforeEach(() => {
    sandbox = sinon.sandbox.create();
    debounceTime = sandbox.stub(
        Observable.prototype, 'debounceTime',
        () => {             
            console.log('-----------------inside debounce stub') //never called...
            return this;
        }
    );

    epicMiddleware = createEpicMiddleware(combineEpics(stackedOverTimeMouseEventEpic));
    mockStore = configureMockStore([epicMiddleware]);
    store = mockStore({});
});

afterEach(() => {
    epicMiddleware.replaceEpic(stackedOverTimeMouseEventEpic);
    debounceTime.restore();
    sandbox.restore();
});

it('Epic...', () => {
    const ret = store.dispatch({"type": "MOUSE_OVER"});     
    // expect(debounceTime.withArgs(200).calledOnce).to.be.true;    //returns false
    expect(store.getActions()).to.deep.equal([]);                   //returns [{"type": "MOUSE_OVER"},{"type": "@@redux-observable/EPIC_END"}]
});
于 2016-12-20T10:22:52.673 に答える