如何使用jest测试redux动作调用的方法

时间:2018-04-05 00:07:09

标签: reactjs react-redux jest

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

actions.js

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

services.js

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

现在在我的spec文件中,我正在测试动作以查看是否调用了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. 如何编写此方法的单元测试?

1 个答案:

答案 0 :(得分:0)

  1. 除非您发布所有相关代码,否则我们无法告诉您它为什么不起作用。由于您未在发布的代码中显示watchFoo的任何使用情况,因此无法告诉您它为何无效。您的问题也没有提到takeEvery是什么以及它应该如何与您的代码进行交互。您使用的是redux-saga吗?
  2. 直接测试watchFoo() *。
  3. 您正在编写的测试是测试services.js与redux-mock-store的集成,这不是一个有用的测试。

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

    但你特别提到了单元测试,所以你根本不需要商店。

    *如果您使用的是还没有提及的redux-saga,但我猜测您的takeEvery来自哪里,建议的方法是测试在这里描述:https://redux-saga.js.org/docs/advanced/Testing.html。不需要嘲笑。