【问题标题】:How to test a portion of code that includes a fetch call in JavaScript如何在 JavaScript 中测试包含 fetch 调用的部分代码
【发布时间】:2019-01-04 00:50:43
【问题描述】:

假设我有这段代码(来自 Create React App):

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

class App extends Component {

  componentDidMount() {
    fetch('manifest.json').then(r => r.json()).then(data => {
      console.log(data);
    }).catch(e => console.log(e));
  }

  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h1 className="App-title">Welcome to React</h1>
        </header>
        <p className="App-intro">
          To get started, edit <code>src/App.js</code> and save to reload.
        </p>
      </div>
    );
  }
}

export default App;

如何测试componentDidMount并获得100%的代码覆盖率?

我用过nockisomorphic-fetch,但是有更好的选择吗?

谢谢。

【问题讨论】:

标签: reactjs unit-testing fetch code-coverage


【解决方案1】:

fetch 您指的是基于 create-react-app 的项目中的全局。事实上,afaik,他们在内部使用 isomorphic-fetch 来公开它(作为旧版浏览器的 poly-fill)。由于 create-react-app 带有 jest,您可以在开始测试之前使用 jest 模拟全局。

使用标准的 setupTests.js 模块模拟任何全局变量,例如 fetch。

您可以使用global 命名空间来访问/模拟它们。

global.fetch = jest.fn();

【讨论】:

  • 谢谢。我必须使用 jest.fn().mockImplementation 并创建 2 个 window.Response,我必须返回一个带有 Promise.reject 以涵盖 catch() 案例。你能用我的评论改进你的答案吗?谢谢。
【解决方案2】:

您可以将fetch 作为道具传递到您的组件中,因此在您的测试中您可以传递fetch 的模拟版本

示例类:

class Foo extends React.Component {
  componentDidMount () {
      const { fetch } = this.props
      ... your fetch code ... 
      }
    }
}

当你在使用组件的时候,你传入real fetch:

const fetch = window.fetch // or however you're importing it

const UsesFoo = () => (
 <Foo fetch={fetch} />
)

现在你的测试:(假设开玩笑和浅渲染)

const fakeFetch = jest.fn()

it('Should mock fetch', () => {
  const res = shallow(<Foo fetch={fakeFetch} />)
})

【讨论】:

  • 我也喜欢这种“依赖注入”...谢谢!
  • @MarcoAfonso 没问题 :) 如果您喜欢该解决方案,请随时投票。
猜你喜欢
  • 2020-01-29
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2021-12-22
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多