TypeError:state.userInfo 在 Jest 测试中不可迭代

Posted

技术标签:

【中文标题】TypeError:state.userInfo 在 Jest 测试中不可迭代【英文标题】:TypeError: state.userInfo is not iterable in Jest Testing 【发布时间】:2020-07-29 19:53:28 【问题描述】:

当我在我的一个 reducer 上运行我的笑话测试时,我不断收到这个 TypeError。似乎与找不到商店的状态有关?

这是我在减速器测试文件上运行 yarn test --coverage 时在控制台中遇到的确切错误:

控制台错误:

  TypeError: state.userInfo is not iterable

  63 |         allDocumentComments: action.payload.allDocumentComments ? _.cloneDeep(action.payload.allDocumentComments) : null,
  64 |         userInfo: [
> 65 |           ...state.userInfo,
     |                    ^
  66 |           ...action.payload.userInfo
  67 |         ]
  68 |       ;

  at _default (src/reducers/sopCommentsReducer.js:65:20)
  at Object.test (src/tests/reducers/sopCommentsReducer.test.js:130:40)

这是我要通过的测试的减速器测试文件:

Reducer 测试文件:

import sopCommentsReducer from '../../reducers/sopCommentsReducer';
import * as mocks from '../../setupTests';
import _ from 'lodash';

// Testing tableActions.js reducer equivalents
describe('testing reducers to tableActions.js actions', () => 

    const allDocumentComments = 
        'comement-string' :
            _id: "5e792",
            document_id: "1",
            commenter_id: "2",
            comment: "this is a comment",
            resolved: false,
            timestamp: "2020-03-23 21:31:36+00:00",
            resolved_timestamp: "2020-03-24 17:36:15+00:00",
            total_comments: 1,
            replies: [
                
                    commenter_id: "3",
                    comment: "Reply",
                    timestamp: "2020-03-23 21",
                
            ],
        
    ;

    const userAccountData = [
        _id: "5e792",
        msid: "alex",
        roles: ["admin"],
        email_address: "alex@yahoo.com",
        family_name: "Pelo",
        given_name: "Alex",
    ];

    describe('testing addSOPComment action reducer', () => 
        test('Returns the correct reducer result given the action', () => 
            let expectedAction = 
                'payload': 
                    'allDocumentComments': allDocumentComments,
                    'userInfo': userAccountData
                ,
                'type': 'ADD_SOP_COMMENT'
            ;

            let addSOPCommentReducerResult = sopCommentsReducer(mocks.mockFullStore, expectedAction);
            expect(addSOPCommentReducerResult).toMatchSnapshot();
        );
    );

这是测试用例失败的reducer文件

缩小文件:

import 
  ADD_SOP_COMMENT,
 from '../actions/types';

import _ from 'lodash';

const INITIAL_STATE = 
  allDocumentComments: ,
  userInfo: [],
;

export default (state = INITIAL_STATE, action) => 
  switch(action.type)
    case ADD_SOP_COMMENT:
      return 
        ...state,
        allDocumentComments: action.payload.allDocumentComments ? _.cloneDeep(action.payload.allDocumentComments) : null,
        userInfo: [
          ...state.userInfo,
          ...action.payload.userInfo
        ]
      ;
 default:
      return state;
  
;

【问题讨论】:

你能提供一个codeandbox链接吗? 尝试打印您的state,以确保其中包含的内容 【参考方案1】:

我也面临同样的问题。我可以分享我犯了什么错误以及我是如何解决的。

我在编写集成测试期间模拟 axios 请求时犯了一个错误。

例如:

假设一旦用户成功登录,我们将进行网络调用以获取愿望清单、购物车详细信息并初始化两者的状态。但是,在编写测试用例时,我们忘记模拟愿望清单/购物车的响应部分,在这种情况下,如果处理不正确,它可能会将状态初始化为 null

所以,这是错误,我通过更正模型解决了这个问题。请正确检查您的模型,也许您正在犯同样的错误。

【讨论】:

以上是关于TypeError:state.userInfo 在 Jest 测试中不可迭代的主要内容,如果未能解决你的问题,请参考以下文章

vuex的基本使用

ES6使用常量做为函数名

如何以 redux 形式重置初始值

react绑定事件处理函数this

vuex 数据持久化,防止刷新丢失

TypeError: 'float' 类型的对象没有 len() & TypeError: 'float' 对象不可迭代