当前位置: 首页 > 面试题库 >

开玩笑—模拟在React组件内部调用的函数

杨利
2023-03-14
问题内容

Jest提供了一种模拟函数的方法,如其文档中所述

apiGetMethod = jest.fn().mockImplementation(
    new Promise((resolve, reject) => {
        const userID = parseInt(url.substr('/users/'.length), 10);
        process.nextTick(
            () => users[userID] ? resolve(users[userID]) : reject({
                error: 'User with ' + userID + ' not found.',
            });
        );
    });
);

但是,这些模拟仅在直接在测试中调用函数时才起作用。

describe('example test', () => {
    it('uses the mocked function', () => {
        apiGetMethod().then(...);
    });
});

如果我有一个这样定义的React Component,该如何模拟呢?

import { apiGetMethod } from './api';

class Foo extends React.Component {
    state = {
        data: []
    }

    makeRequest = () => {
       apiGetMethod().then(result => {
           this.setState({data: result});
       });
    };

    componentDidMount() {
        this.makeRequest();
    }

    render() {
        return (
           <ul>
             { this.state.data.map((data) => <li>{data}</li>) }
           </ul>
        )   
    }
}

我不知道如何制作它,所以Foo组件调用了我的模拟apiGetMethod()实现,以便我可以测试它是否可以正确地呈现数据。

(这是一个简化的,人为的示例,目的是为了了解如何模拟在React组件内部调用的函数)

编辑:api.js文件,为清楚起见

// api.js
import 'whatwg-fetch';

export function apiGetMethod() {
   return fetch(url, {...});
}

问题答案:

您必须./api像这样模拟模块并将其导入,以便您可以设置模拟的实现

import { apiGetMethod } from './api'

jest.mock('./api', () => ({ apiGetMethod: jest.fn() }))

在您的测试中,可以使用mockImplementation设置模拟的工作方式:

apiGetMethod.mockImplementation(() => Promise.resolve('test1234'))


 类似资料:
  • 问题内容: 我是开玩笑/酶的新手,正尝试模拟对返回Promise的aync函数的调用,该调用是在componentDidMount方法的react组件内进行的。 该测试正在尝试测试componentDidMount将Promise返回的数组设置为状态。 我遇到的问题是,在将数组添加到状态之前,测试已完成并通过。我正在尝试使用“完成”回调来使测试等待,直到承诺解决为止,但这似乎不起作用。 我尝试将E

  • 我有下面的打字稿类,我想测试在笑话。 这是我的测试: 如何模拟MyClass中使用的foo函数,以使测试通过?

  • 问题内容: 我有一个React组件(为了演示该问题,对此进行了简化): 现在,我要测试提供的值的调用。 为此,我想创建一个代替组件方法的笑话模拟函数。 到目前为止,这是我的测试用例: 但是我在控制台中得到的只是: 语法错误 所以我的问题是,如何正确地用酶模拟组分方法? 问题答案: 可以通过以下方式模拟该方法: 您还需要在被测组件的包装器上调用.update,以便正确注册模拟功能。 语法错误来自错误

  • 问题内容: 首先,我是和的新手。 我有一个实例化的类,我想测试一下。 这是我的代码: 我想测试一下我的功能。我的头,我认为测试fs.existsSync的状态是个好主意。如果返回,则必须调用。所以我尝试写一些测试: 但是,我有一个错误: 您能帮我调试和测试我的功能吗? 问候。 问题答案: 出现错误是因为它正在寻找在您的对象上调用的方法,该方法不存在。如果您可以访问测试中的模块,则可以监视如下方法:

  • 问题内容: 我想嘲笑localStorage方法以进行错误模拟。我在Utility.js中定义了localstorage getter和setter方法。我想嘲笑在调用时抛出错误。 开玩笑, 但是模拟永远不会被调用。我也尝试过 问题答案: 这与Andreas在答案中建议的一致,但是我能够使用Storage接口对其进行模拟。我做了这样的事情 开玩笑, 这次公关讨论也很有帮助。

  • 问题内容: 我正在使用NumericInput,当我在设备上运行应用程序时,它可以正常工作。 但是,当我运行时,会遇到各种错误: 和 第一个问题 :那正常吗? 第二个问题 :如果是,我该如何嘲笑? 遵循本指南,看来我需要做: 但这是行不通的。我也尝试过: 没有成功。 o_0这是怎么回事? 干杯! 问题答案: 这是正式的笑话预处理器存在的问题。 这是我开玩笑的配置文件: 为了解决这个问题,这是我的新