【问题标题】:how to test methods called by redux actions using jest如何使用 jest 测试 redux 操作调用的方法
【发布时间】:2018-09-14 16:16:46
【问题描述】:

我正在尝试编写一个单元测试来测试在调度操作时是否调用了正确的方法。这是我的文件:

actions.js

export const foo = () => ({type: 'fooAction'})

services.js

function* watchFoo(){
   yield takeEvery('fooAction', setFoo);
}
function setFoo() { console.log('foo'); }

现在在我的规范文件中,我正在测试操作以查看是否调用了 setFoo。

测试/services.js

import configureStore from 'redux-mock-store';
describe('test setFoo', () => {
   const mockStore = configureStore([]);
   const store = mockStore([]);
   store.dispatch(actions.foo());

   const storeActions = store.getActions();
   expect(storeActions).toEqual([action]); // this is true
})

当我尝试调试 setFoo 时,不会调用 setFoo 方法。我确实将间谍设置为 setFoo (在上面的代码中删除了它),它没有被调用。我还尝试为服务创建一个模拟,然后监视模拟的服务。即使这样 setFoo 也没有被调用。需要明确的是,问题是:

  1. 为什么我的 setFoo 方法没有被调用?
  2. 如何为这种方法编写单元测试?

【问题讨论】:

  • Services.js / watchFoo() 看起来并没有以任何方式集成到您的商店中。我不明白为什么会调用它。如果这个测试有效,它将测试 redux-mock-store 而不是你的代码。
  • 在您的测试中,不要使用模拟商店。直接测试 watchFoo 即可。
  • @stone,商店配置添加WatchFoo,我只是这里没有添加。应用程序工作得很好。这些问题用于测试。
  • @VinodKolla 你知道怎么解决吗?

标签: reactjs react-redux jestjs


【解决方案1】:
  1. 除非您发布所有相关代码,否则我们无法告诉您为什么它不起作用。由于您在发布的代码中没有显示watchFoo 的任何用法,因此无法告诉您为什么它不起作用。您的问题也没有提到 takeEvery 是什么以及它应该如何与您的代码交互。你在用redux-saga吗?
  2. 直接测试watchFoo()*。

您正在编写的测试正在测试 services.js 与 redux-mock-store 的集成,这不是一个有用的测试。

如果您想要一个反映您正在运行的代码的集成测试,您需要使用真实商店进行测试。

但是您特别提到了单元测试,因此您根本不需要商店。

*如果您使用的是 redux-saga,但我猜这就是您的 takeEvery 的来源,这里描述了推荐的测试方法:https://redux-saga.js.org/docs/advanced/Testing.html。不需要嘲笑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 2017-12-18
    • 2016-02-21
    • 2019-07-29
    • 2018-06-10
    • 2017-09-05
    • 2018-04-26
    • 1970-01-01
    相关资源
    最近更新 更多