javascript - stub 获取单元测试与 enzyme 和玩笑发生 react

标签 javascript reactjs unit-testing sinon enzyme

我正在尝试使用 enzyme 和玩笑来对 React 中的 API 调用进行 stub 。

我的 React 组件代码如下所示。这非常有效。

async componentDidMount() {
    try {
      const res = await fetch(FETCH_ENDPOINT)
        if(res.ok) {
          const data = await res.json()
          this.setState({
            players: data.players,
            error: false
          });
        } else {
          throw new Error('Something went wrong');
        }
    } catch (error) {
      this.setState({
        error: true,
      })
    }
  }

我正在尝试模拟响应并测试 api 调用的成功和失败。我的测试代码如下所示,它永远不会使用 api 的 stub 响应更新 this.state.players 。我觉得我犯了一个简单的错误。谁能看出下面的代码有什么问题吗?它只是显示该行的长度为 0,而不是 2

也许这与我的 componentDidMount api 调用中有 2 个 promise 有关,但我的规范文件中只有一个?

expect(renderedComponent.state('players').length).toEqual(2)

import React, { Component } from 'react';
import App from './App';
import { shallow } from 'enzyme'

const result = {
    'players': [
      {
        'firstname': 'Robbie',
        'lastname': 'Keane',
      },
      {
        'firstname': 'Alan',
        'lastname': 'Shearer',
      }
    ]
  }

describe('App', () => {
  describe('componentDidMount', () => {
    it('sets the state componentDidMount', async () => {
      window.fetch = jest.fn().mockImplementation(() => ({
        status: 200,
        ok: true,
        json: () => new Promise((resolve, reject) => {
          resolve({
            result: {
             'players': [
               { 'firstname': 'Robbie', 'lastname': 'Keane' },
               { 'firstname': 'Alan', 'lastname': 'Shearer' }
            ]
          })
        })
      }))

      const renderedComponent = await shallow(<App />)
      await renderedComponent.update()
      expect(renderedComponent.state('players').length).toEqual(2)
    })
  })
})

最佳答案

正如您所提到的,您的测试文件中还需要一个 Promise。另外,您应该从 json 对象中删除 result 属性。这是一个有效的测试代码:

window.fetch = jest.fn().mockImplementation(() => {
    return new Promise((resolve, reject) => {
        resolve({
            status: 200,
            ok: true,
            json: () => new Promise((resolve, reject) => {
                resolve({
                    'players': [
                        { 'firstname': 'Robbie', 'lastname': 'Keane' },
                        { 'firstname': 'Alan', 'lastname': 'Shearer' }
                    ]
                });
            })
        });
    });
})

测试组件:

import React from 'react';

const TEST = "test";

class Test extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
        players: [],
        error: false,
    };
  }
  async componentDidMount() {
    try {
      const res = await fetch(TEST)
      if(res.ok) {
        const data = await res.json()
        this.setState({
          players: data.players,
          error: false,
        });
      } else {
        throw new Error('Something went wrong');
      }
    } catch (error) {
      this.setState({
        error: true,
      });
    }
  }
  render() {
    return (<div>Hello world</div>);
  }
}

export default Test;

关于javascript - stub 获取单元测试与 enzyme 和玩笑发生 react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52903758/

相关文章:

c# - AutoFixture 和流畅的 Moq 语法

unit-testing - 如何在 Angular dart 测试中触发组件事件?

unit-testing - ReactiveUI - 取消另一个命令 - 文档中代码的单元测试失败

java - GWT 入门

javascript - 使用 HTML5 制作该 block 的屏幕截图

javascript - 将组件键设置为等于 Route 中的路径参数

javascript - 将 excel 二维数组转换为包含列名的嵌套属性对象

javascript - Vue Js 我应该使用 Vuex 吗?

javascript - 以编程方式添加过渡样式而不删除现有样式

javascript - 样式组件: how to select child component?