redux-saga-test-plan put 效果不匹配,但实际和预期的有效载荷相等

Rez*_*ami 7 reactjs jestjs redux redux-saga redux-saga-test-plan

我正在测试这个传奇

export function* foo() {
  yield put(actions.start());
  yield put(actions.bar({
    onSuccess: () => {
      // do something
    },
    onFailed: () => {
      // do something else
    }
  }));
  yield put(userActions.done());
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试

it('should test foo saga, and put start, bar and done actions', () => {
  // assertions / expect
  testSaga(sagas.foo)
    .next()
    .put(actions.start())
    .next()
    .put(
      actions.bar({
        onSuccess: () => {},
        onFailed: () => {},
      }),
    )
    .next()
    .put(actions.done())
    .next()
    .isDone();
});
Run Code Online (Sandbox Code Playgroud)

当我从 saga 中删除有效载荷并测试它通过时没有问题,但是当我添加有效载荷(不仅是 onSuccess 和 onFailed 回调的任何内容)时,它向我显示了这个错误

Assertion failed: put effects do not match

Expected
--------
{
  channel: null,
  action: 
   { type: 'BAR',
     payload: 
      {
        onSuccess: [Function: onSuccess],
        onFailed: [Function: onFailed]
      }
  }
}

Actual
------
{
  channel: null,
  action: 
   { type: 'BAR',
     payload: 
      {
        onSuccess: [Function: onSuccess],
        onFailed: [Function: onFailed]
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,实际和预期的有效载荷相等,但测试没有通过!

sli*_*wp2 2

onSuccess方法onFailed在传奇和测试用例中有不同的参考。断言肯定会失败。

\n

由于您在 saga 中声明了这两个方法,因此我们无法通过模块需求将它们导入到我们的测试用例中。因此,我们无法在测试用例中使用这两种方法的相同引用。

\n

我们可以使用提供的检查redux-saga-test-plan一般断言。

\n
\n

如果您的传奇产生不确定类型的值或效果断言或其他一般断言不易涵盖的内容,那么您可以使用inspect您最喜欢的断言库来检索实际产生的值并执行您自己的断言。

\n
\n

我们用它来获得返回的效果yield put(actions.bar({...}))actions.bar({...})然后,我们可以获取测试用例中创建的 redux 操作,包括onSuccessonFailed方法以及您actions.bar()在传奇中的操作创建者中传递的所有内容foo

\n

我们可以使用expect.any(Function)jestjs 提供的断言这两个方法。您甚至可以执行和测试它们。

\n

例如

\n

saga.ts

\n
import { put } from \'redux-saga/effects\';\nimport * as actions from \'./actions\';\n\nexport function* foo() {\n  yield put(actions.start());\n  yield put(\n    actions.bar({\n      onSuccess: () => {\n        // do something\n      },\n      onFailed: () => {\n        // do something else\n      },\n    }),\n  );\n  yield put(actions.done());\n}\n
Run Code Online (Sandbox Code Playgroud)\n

saga.test.ts

\n
import { testSaga } from \'redux-saga-test-plan\';\nimport { foo } from \'./saga\';\nimport * as actions from \'./actions\';\nimport { PutEffect } from \'redux-saga/effects\';\nimport { AnyAction } from \'redux\';\n\ndescribe(\'54885611\', () => {\n  it(\'should pass\', () => {\n    const logSpy = jest.spyOn(console, \'log\');\n    testSaga(foo)\n      .next()\n      .put(actions.start())\n      .next()\n      .inspect<PutEffect<AnyAction>>((yieldedValue) => {\n        expect(yieldedValue.payload.action).toEqual({\n          type: \'START\',\n          payload: expect.objectContaining({ onSuccess: expect.any(Function), onFailed: expect.any(Function) }),\n        });\n        // test onSuccess\n        yieldedValue.payload.action.payload.onSuccess();\n        expect(logSpy).toBeCalledWith(\'do something\');\n\n        // test onFailed\n        yieldedValue.payload.action.payload.onFailed();\n        expect(logSpy).toBeCalledWith(\'do something else\');\n\n        logSpy.mockRestore();\n      })\n      .next()\n      .put(actions.done())\n      .next()\n      .isDone();\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n

单元测试结果:

\n
 PASS  src/stackoverflow/54885611/saga.test.ts\n  54885611\n    \xe2\x9c\x93 should pass (25 ms)\n\n  console.log\n    do something\n\n      at console.<anonymous> (node_modules/jest-mock/build/index.js:848:25)\n\n  console.log\n    do something else\n\n      at console.<anonymous> (node_modules/jest-mock/build/index.js:848:25)\n\n------------|---------|----------|---------|---------|-------------------\nFile        | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n------------|---------|----------|---------|---------|-------------------\nAll files   |     100 |      100 |     100 |     100 |                   \n actions.ts |     100 |      100 |     100 |     100 |                   \n saga.ts    |     100 |      100 |     100 |     100 |                   \n------------|---------|----------|---------|---------|-------------------\nTest Suites: 1 passed, 1 total\nTests:       1 passed, 1 total\nSnapshots:   0 total\nTime:        3.351 s\n
Run Code Online (Sandbox Code Playgroud)\n