Jest - 测试redux动作

时间:2016-11-01 06:12:36

标签: testing mocking redux action jestjs

我尝试使用Jest测试我的应用程序的redux操作。我已经查看了测试网站@redux.js.org和其他论坛帖子,但我不明白我为什么会收到错误,我想我还没弄到嘲弄作品。

我的行动是在index.js:

export const setResponse = (res) => {
    return {
        type: 'RESPONSE_RECEIVED',
        payload: res
    }
};

我的测试是actions.test.js:

import * as actions from '../src/client/scripts/actions/index'

describe('actions', () => {
  it('should create an action to receive a response', () => {
    const payload = {response: 'solr_json'};
    const expectedAction = {
      type: 'RESPONSE_RECEIVED',
      payload
    }
    expect(actions.setResponse(payload)).toEqual(expectedAction)
  })
});

我收到错误'预期未定义为等于对象...'所以我认为actions.setResponse并不存在,所以我打印出actions.setResponse,它看起来像这样:

{ [Function: setResponse]
  _isMockFunction: true,
  getMockImplementation: [Function],
  mock: { calls: [], instances: [] },
  mockClear: [Function],
  mockReturnValueOnce: [Function],
  mockReturnValue: [Function],
  mockImplementationOnce: [Function],
  mockImpl: [Function],
  mockImplementation: [Function],
  mockReturnThis: [Function] }

所以似乎函数在那里,我如何在Jest测试中实际调用函数?即使我改变了

export const setResponse = (res) =>

export function setResponse(res)

(所以它与redux.js.org教程的格式相同)我得到了同样的错误。作为参考,这是我的package.json的开玩笑部分:

"jest": {
    "scriptPreprocessor": "node_modules/babel-jest",
    "testFileExtensions": [
      ".test.js"
    ],
    "testPathDirs": [
      "__tests__"
    ],
    "moduleFileExtensions": [
      "js"
    ],
    "unmockedModulePathPatterns": [
      "node_modules/react",
      "node_modules/react-addons-test-utils",
      "node_modules/react-dom"
    ]
  }

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

问题似乎是您要测试的模块被模拟,导致您使用app.controller('speshController',function($scope,$http){ $scope.data=[{ 'value':1, 'name':'aaa' },{ 'value':2, 'name':'bvc' },{ 'value':3, 'name':'rtcv' },{ 'value':4, 'name':'uytg' } ] $scope.listOfRestaurant=[]; angular.forEach($scope.data,function(obj){ var data={'name':obj.name,'value':obj.value}; $scope.listOfRestaurant.push(data); }) $scope.getValue=function(){ } }) 。来自文档:

  

与所有匹配的正则表达式模式字符串数组   模块加载器之前的模块将自动返回模拟   他们。如果模块的路径与此列表中的任何模式匹配,则为   会被模块加载器自动模拟。

我猜想如果删除此行,模块不会自动模拟。通常,使用unmockedModulePathPatterns更容易模拟您想要在测试中直接模拟的内容。或者您将源文件夹添加到jest.mock

列表中