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

How to test redux-saga take with pattern function by Jest?

我有一些 saga 使用 take effect 按模式获取动作。现在,我正在尝试对其进行测试:

传奇:

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
            )
        );
    });

在 take 模式中我有一个匿名函数,所以我如何测试 take 中的模式等于我在测试中提供的模式?

现在的测试结果是:

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,我无法确定模式是否相等。

Jest 可以帮助您断言效果层的顺序。在单元测试中,您想要测试一段代码(即 saga、函数等)而不是执行链的流程。因此,您要测试的模式是 [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()
    })
  })
})

一般来说,如果您想测试该模式,请使用单独的测试来仅测试该特定功能。并在给定不同参数的情况下断言输出。