reactjs - 使用重新选择选择器时无法提供/测试传奇

我一直在使用 redux-saga-test-plan 编写一些 redux-saga 测试,但是在尝试提供一些选择以伪造一些值给 expectSaga 测试时遇到了一些问题。似乎提供者并没有用我们的值替换我们的重新选择函数调用,而是实际上试图运行重新选择函数。该项目正在使用 react-boilerplate 模板。

我已经尝试过使用匹配器来伪造选择器的不同变体,但仍然遇到同样的问题。

这是我要测试的传奇:

export function* categoriseA() {
  const sku = yield select(makeSelectSKU());
  const { ql, sscc } = yield select(makeSelectItemData());
  const site = yield select(makeSelectSite());

  const params = {
    url: `refurbishment/api/sites/${site}/refurbishments`,
    method: 'put',
    data: {
      quality_label: ql,
      classification_type: 'A_GOODS',
      ...(sku && { sku }), // a way of conditionally creating a property
      ...(sscc && { sscc }), // a way of conditionally creating a property
    },
  };
  yield put({ type: PUT_A_GOODS_REQUEST, ...params });
  yield put(push(SCAN_BARCODE_URL));
}

使用这个测试:

it('it pushes SCAN_BARCODE_URL and create a PUT_A_GOODS_REQUEST', () => {
  expectSaga(saga)
    .provide([
      [select(selectors.makeSelectSKU()), 'sku'],
      [select(selectors.makeSelectItemData()), mockItemData],
      [select(selectors.makeSelectSite()), 'site'],
    ])
    .put(push(SCAN_BARCODE_URL))
    .dispatch(chooseACategory())
    .run();
});

我得到的错误是: 似乎 reselect 选择器函数正在运行并试图从我认为会被提供者伪造的 reducer 访问全局状态?

 TypeError: Cannot read property 'global' of undefined
          at selectGlobal (/Users/ccc/development/workspace/grip/refurb-frontend/app/containers/App/selectors.js:945:38)
          at /Users/ccc/development/workspace/grip/refurb-frontend/node_modules/reselect/lib/index.js:87:37
          at /Users/ccc/development/workspace/grip/refurb-frontend/node_modules/reselect/lib/index.js:39:25
          at runSelectEffect (/Users/ccc/development/workspace/grip/refurb-frontend/node_modules/@redux-saga/core/dist/redux-saga-core.dev.cjs.js:761:26)
          at runEffect (/Users/amurray/development/workspace/grip/refurb-frontend/node_modules/@redux-saga/core/dist/redux-saga-core.dev.cjs.js:1234:7)
          at digestEffect (/Users/amurray/development/workspace/grip/refurb-frontend/node_modules/@redux-saga/core/dist/redux-saga-core.dev.cjs.js:1301:5)
          at next (/Users/ccc/development/workspace/grip/refurb-frontend/node_modules/@redux-saga/core/dist/redux-saga-core.dev.cjs.js:1191:9)
          at proc (/Users/ccc/development/workspace/grip/refurb-frontend/node_modules/@redux-saga/core/dist/redux-saga-core.dev.cjs.js:1138:3)
          at /Users/ccc/development/workspace/grip/refurb-frontend/node_modules/@redux-saga/core/dist/redux-saga-core.dev.cjs.js:614:17
          at immediately ...

最佳答案

你不应该调用你试图模拟的选择器。 而不是

select(selectors.makeSelectSKU()), 'sku']

你应该省略括号并做:

select(selectors.makeSelectSKU), 'sku']

https://stackoverflow.com/questions/57181906/

相关文章:

node.js - TransferHttpCacheModule 不会阻止 Angular 8 中

node.js - 如何在模块加载到 NodeJS 之前获取和使用 Secret Manager 值

amazon-web-services - 使用 aws sts assume-role 配置 AW

php - 在电子邮件中添加 PhpSpreadsheet 附件

javascript - 使用 axios 向服务器发出请求会卡住 React Native 应用程

npm - 在私有(private)网络上托管 github 发布

firebase - 我应该使用 Firebase 动态链接而不是通用链接和应用链接吗?

json - 将选定的内容模型及其内容导出到 Contentful 中的另一个空间

node.js - 如何在 node 中集成 swagger 和 fastify 框架

java - 如何使用 .p8 文件签署 json 网络 token