javascript - TypeError : sentimentCurrent. map 不是一个函数?

标签 javascript reactjs jestjs

尝试为以下函数编写单元测试。

我收到错误

TypeError: sentimentCurrent.map is not a function

      65 |     console.log("sentimentData:",sentimentCurrent,typeof sentimentCurrent);
      66 | 
    > 67 |     sentimentCurrent.map(function (k, num) {
         |                      ^
      68 |       let dateCreated = new Date(k.created * 1000);
      69 | 
      70 |       DataInput.push({

实际函数如下,它接收原始数据,然后准备将其用于线形图中。

    export default function generateLineGraphPointsSentiment(
  sentimentData
) {
  
  if (sentimentData !=null) {
  const DataInput = [];

  Object.keys(sentimentData).map(function (key, item) {
    var sentimentCurrent = sentimentData[key];
    sentimentCurrent.map(function (k, num) {
      let dateCreated = new Date(k.created * 1000);

      DataInput.push({
        created: dateCreated,
        sentiment: k.sentiment,
        magnitude: k.magnitude,
        date: k.createdDay,
      });
    });

    // {created: 1601820360, sentiment: -0.1, magnitude: 0.1, createdDay: "2020-10-05"}
  });

  

  return DataInput
}
else { return 0 }
}

测试用例如下,

import '@testing-library/jest-dom';
import { render, screen } from '@testing-library/react';
import generateLineGraphPointsSentiment from './generateGraphPointsAnalysis';

    const ExpressionData = [
  {
    "2021-08-21": [
        {
            "id": 96451,
            "user_id": "xxxx",
            "sentiment": 0.4,
            "magnitude": 1,
            "created": 1629535058,
            "createdDay": "2021-08-21"
        },
        {
            "id": 96452,
            "user_id": "xxx",
            "sentiment": -0.1,
            "magnitude": 1,
            "created": 1629535060,
            "createdDay": "2021-08-21"
        },
        
    ]
}

// const setSelectedDate = jest.fn();

describe('Generates Graph Points Sentiment', () => {
  it('should show loader for the LineGraphs graph if no data is present', () => {
    generateSentimentLineGraph = generateLineGraphPointsSentiment(SentimentData);
    console.log(generateSentimentLineGraph,SentimentData,typeof SentimentData);

    expect(generateSentimentLineGraph).toHaveReturned();
  });
});

对我的代码有什么问题有什么想法吗?它目前在开发中工作,不知道为什么现在测试失败了?我认为这与正在处理的数据类型或我如何使用 map 函数有关。也许我可以简化第一个 map 功能?

更新了测试数据以复制开始时发生的情况,第一个 map 数据之后是这样的,

[
    {
        "id": 96451,
        "user_id": "xxx",
        "sentiment": 0.4,
        "magnitude": 1,
        "created": 1629535058,
        "createdDay": "2021-08-21"
    },
    {
        "id": 96452,
        "user_id": "xxx",
        "sentiment": -0.1,
        "magnitude": 1,
        "created": 1629535060,
        "createdDay": "2021-08-21"
    },
]

请记住,当前在折线图中使用此方法是有效的,就像 ReCharts 库中的这样,

<LineChart
        width={550}
        height={250}
        data={Sentiment}
        syncId="anyId"
        margin={{
          top: 10,
          right: 30,
          left: 0,
          bottom: 0,
        }}
      >

很好的答案,现在适用于测试,但是在开发环境中加载时我奇怪地收到此错误,

enter image description here

最佳答案

如果功能正常 - 我认为问题出在您的 const SentimentData 上.

因为从表面上看,Object.keys(sentimentData)预计sentimentData成为一个“正确”的对象,例如 {key: "bla"} 。相反,您给它一个数组,从技术上讲,它仍然是一个对象,因此对于两个元素的数组,您将获得两个键: ["0", "1"] .

然后你就sentimentCurrent = sentimentData[key];sentimentCurrent = sentimentData["0"]; 相同它只是重新调整数组中的第一个或第二个对象。

然后你尝试运行 Array.map()对一个没有意义的对象执行函数。

所以,我的建议是,如果功能按预期工作,请尝试记录您的 sentimentData并相应地更新测试中的模拟数据。

这应该有效:

function generateLineGraphPointsSentiment(sentimentData) {
  if (sentimentData != null) {
    const DataInput = [];

    Object.keys(sentimentData).map(function (key, item) {
      var sentimentCurrent = sentimentData[key];

      sentimentCurrent.map(function (k, num) {
        let dateCreated = new Date(k.created * 1000);

        DataInput.push({
          created: dateCreated,
          sentiment: k.sentiment,
          magnitude: k.magnitude,
          date: k.createdDay,
        });
      });

      // {created: 1601820360, sentiment: -0.1, magnitude: 0.1, createdDay: "2020-10-05"}
    });

    return DataInput;
  }
}

const SentimentData = {
  "2021-08-21": [
    {
      id: 96451,
      user_id: "xxxx",
      sentiment: 0.4,
      magnitude: 1,
      created: 1629535058,
      createdDay: "2021-08-21",
    },
    {
      id: 96452,
      user_id: "xxx",
      sentiment: -0.1,
      magnitude: 1,
      created: 1629535060,
      createdDay: "2021-08-21",
    },
  ],
};

const generateSentimentLineGraph = generateLineGraphPointsSentiment(SentimentData);

console.log(generateSentimentLineGraph);

关于javascript - TypeError : sentimentCurrent. map 不是一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70796933/

相关文章:

reactjs - 如何向作为变量传递的 react 组件添加属性?

reactjs - 使用 Enzyme 测试无状态 React 组件内的函数

javascript - Jest mockImplementation(Promise.resolve) 在监视从另一个类 (Node.js) 调用的对象时返回未定义

javascript - 开 Jest – 导出问题 { 默认为

javascript - 如何从父 View 调用 subview 方法?

javascript - Chrome 扩展 : Message passing confusion

javascript - 如何更改 swiper.js 中的滑动方向?

javascript - req.url.replace(/\/?(? :\? .*)?$/, '' ) Node js

javascript - D3 : When I add a transition, 我的鼠标悬停停止工作...为什么?

reactjs - redux-form 多个复选框,单个数组中的值,没有 bool 值