首页 > 解决方案 > 由于 .map 导致测试用例失败不是函数错误

问题描述

嗨,我有一个反应组件费用总计.js和相应的测试用例费用总计.test.js,如下所示。

费用-total.js

     export default (expenses=[]) => {
      if (expenses.length === 0) {
        return 0;
      } else {
        return expenses
          .map(expense => expense.amount)
          .reduce((sum, val) => sum + val, 0);
      }
    };

费用-total.test.js

import selectExpensesTotal from '../../selectors/expenses-total';
const expenses = [
    {
      id: "1",
      description: "gum",
      amount: 321,
      createdAt: 1000,
      note: ""
    },
    {
      id: "2",
      description: "rent",
      amount: 3212,
      createdAt: 4000,
      note: ""
    },
    {
      id: "3",
      description: "Coffee",
      amount: 3214,
      createdAt: 5000,
      note: ""
    }
  ];

test('Should return 0 if no expenses', ()=>{
    const res = selectExpensesTotal([]);
    expect(res).toBe(0);
});

test('Should correctly add up a single expense', ()=>{
    const res = selectExpensesTotal(expenses[0]);
    expect(res).toBe(321);
});

test('Should correctly add up multiple expenses',()=>{
    const res = selectExpensesTotal(expenses);
    expect(res).toBe(6747);
});

当我运行测试用例时,它因给出错误而失败

TypeError: expenses.map is not a function

我知道测试用例是正确的,但不知道组件有什么问题。谁能帮我解决这个错误?

标签: javascriptarraysreactjsenzyme

解决方案


问题在于使用if (expenses.length === 0)的测试用例selectExpensesTotal(expenses[0])

expenses[0]传递一个没有length属性的对象,因此在被测试的函数中,expenses.length返回undefined. 但是,undefined === 0计算结果为,false因此您的代码进入else块尝试.map在没有该功能的对象上使用,因此会引发错误。


推荐阅读