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
компонент.