JEST TypeError:无法读取未定义的属性“ json”

时间:2020-03-05 15:18:35

标签: javascript node.js jestjs

我很想在这里寻求帮助。我正在尝试以开玩笑的方式测试功能,但我只能坚持一件事。当我尝试模拟提取请求时,出现此错误:

<table className="table table table-bordered table-striped" id="tableBorder">
      <thead className="tableTransform">
        <tr>
          {features.map(feature => (
            <th key={feature.featureName} style={{ color: "white" }}> 
            <Link className="push" to={{pathname:"/FeaturesPage", aboutProps: { id: feature.featureID} }}  >                
              {feature.featureName} 
              </Link></th>
 ))}             
        </tr>    
      </thead>
      <tbody>
        {["featureTechDescription", "sourceSystem", "sampleValues", "featureActiveFlag",
        "featureCreatedDate", "featureEndDate", "dateLoadTimeStamp", "dateUpdateTimeStamp"].map(
          key => (
            <tr key={key}>
              {features.map(feature => (
                <td key={feature.featureName}>
                  {feature[key]}</td>
              ))}
            </tr>
          )
        )}
      </tbody>
    </table>

我要测试的功能是这样的:

TypeError: Cannot read property 'json' of undefined

我要运行的测试是这样:

const updateUI = async () =>{
    const res = await fetch('/sentiment');
    console.log(res);
    try {
        console.log(res.data)
        const allData = await res.json();
        console.log(allData)
        document.getElementById("polarity").innerHTML = allData.polarity;
        document.getElementById("polarityConfidence").innerHTML = allData.polarity_confidence;
        document.getElementById("subjectivity").innerHTML = allData.polarity;
        document.getElementById("subjectivityConfidence").innerHTML = allData.polarity_confidence;
        return allData;
    }catch(error){
        console.log('error')
    }
};

export { updateUI }

我真的不知道从这里去哪里。为什么不获取json对象?是否因为我的updateUI函数在函数的try {}部分中调用了json对象?如果是这种情况,我该如何测试?

2 个答案:

答案 0 :(得分:0)

我在这里看到两个问题

  • 在您的测试中,您正在传递类似const res = await updateUI('/sentiment');这样的字符串,因为updateUI不需要任何参数,所以这无关紧要。

  • 在下一行中,您正在做res.json(),因为从您的实际方法开始,您将仅返回响应。在测试中,您不需要执行.json()。这是因为没有json函数而导致未定义的原因。

答案 1 :(得分:0)

我就是这样做的。可以在 codegrepper

上找到更多信息 <块引用>

确保 Promise.resolve 使用得当,并且模拟数据和 api 数据都具有相同的格式。


const mockFetchUserData = (data) => {
  return global.fetch = jest.fn().mockImplementation(() => 
    Promise.resolve({
      json: () => data
    })
  )
}

it('Display empty list of users', async () => {
// Data can be empty array or array of data  
await mockFetchUserData([])

  await act(async () =>
    render(
      <Router>
        <User />
      </Router>
    )
  })
  const findSearchButtonText = screen.getByText('Search') // is search button rendered
  expect(findSearchButtonText.type).toBe('submit') // is type submit
}