如何通过Jest测试具有模式功能的redux-saga拍摄?

时间:2019-05-21 10:43:51

标签: unit-testing jestjs redux-saga

我有一些传奇故事,他们使用效果来按模式执行动作。现在,我正在尝试对其进行测试:

传奇:

export function* mySaga(spaceId) {
  while (true) {
    const action = yield take(
      action =>
        action.type === MEDIA_SESSION_RESPONSE &&
        action.payload.data.category === ScreenShareData &&
        action.payload.data.topicId === spaceId
    );
    const remoteScreenSessionId = action.payload.data.content.sessionId;
    yield put(addRemoteScreenSessionId(remoteScreenSessionId));
  }
}

测试:

it('test', () => {
        const gen = sagas.mySaga('space_1');
        expect(gen.next().value).toEqual(
            take(
                action =>
                    action.type === MEDIA_SESSION_RESPONSE &&
                    action.payload.data.category === ScreenShareData &&
                    action.payload.data.topicId === spaceId
            )
        );
    });

在接受模式中,我有一个匿名函数,那么如何测试接受模式是否等于我在测试中提供的模式?

现在的测试结果是:

Expected value to equal:
  {"@@redux-saga/IO": true, "combinator": false, "payload": {"pattern": [Function anonymous]}, "type": "TAKE"}
Received:
  {"@@redux-saga/IO": true, "combinator": false, "payload": {"pattern": [Function anonymous]}, "type": "TAKE"}

如果我将使用JSON.stringify,则不能确定模式是否相等。

1 个答案:

答案 0 :(得分:0)

Jest可以帮助您确定效果层的顺序。在单元测试中,您要测试一段代码(即传奇,函数等)而不是执行链的流程。因此,将为您尝试测试的模式提供[Function anonymous]

有一个名为k-redux-saga-tester的小程序库,可以为您提供对模式进行断言的灵活性。填写VALUE,并为MEDIA_SESSION_RESPONSEScreenShareDataspaceId创建必要的模拟。它应该看起来像这样:

describe('mySaga', () => {
     describe('search', () => {

        const test = tester(mySaga) <--- your saga
        const spaceId = 'VALUE';
        const MEDIA_SESSION_RESPONSE = 'VALUE';
        const ScreenShareData = 'VALUE';
        const payload = { data: { category: VALUE, topicId: VALUE }};
        const action = { type: 'YOUR_ACTION_TYPE', payload: { payload }};

        it('should search and set something', () => {
          const mocks = {
               take: [action =>
                    action.type === MEDIA_SESSION_RESPONSE &&
                    action.payload.data.category === ScreenShareData &&
                    action.payload.data.topicId === spaceId]
          }

      expect(test(mocks)).toMatchSnapshot()
    })
  })
})

通常,如果要测试模式,请使用单独的测试仅测试该特定功能。并在给定不同参数的情况下断言其输出。