Jest-Mock функция, вызываемая внутри компонента React

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, определенный как таковой, как я могу его высмеять?

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 компонент вызывает my mocked apiGetMethod() реализация, чтобы я мог проверить, что он правильно отображает данные.

(это упрощенная, надуманный пример ради понимания того, как издеваться над функциями, вызываемыми внутри реагирующих компонентов)

edit: api.файл JS для ясности

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

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

3 ответов


вы должны издеваться над ./api такой модуль и импортируйте его, чтобы вы могли установить имплементацию макета

import { apiGetMethod } from './api'

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

в вашем тесте можно установить, как макет должен работать с использованием mockImplementation:

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

в случае jest.mock метод из ответа @Andreas не сработал для вас. вы можете попробовать следующее в своем тестовом файле.

const api = require('./api');
api.apiGetMethod = jest.fn(/* Add custom implementation here.*/);

это должно выполнить вашу издевательскую версию apiGetMethod внутри Foo компонент.


другое решение издеваться над этим было бы:

window['getData'] = jest.fn();