gpt4 book ai didi

javascript - Jest/Enzyme 在 try/catch 中用 async/await 方法测试 React 组件

转载 作者:行者123 更新时间:2023-11-30 19:42:07 25 4
gpt4 key购买 nike

多年来,我一直在努力尝试使用 Jest 测试此方法,在线搜索似乎无济于事。我在想我需要重构此方法,但我不确定如何以可测试的方式进行重构。

class EmailPage extends Component {
...
async onSubmit(values, applicaitonId) {
try {
this.setState({ loading: true });
const response = await sendEmail(this.formatEmailValues(values), applicaitonId);
console.log(response)
this.setState({ loading: false });
if (response.status !== 'error') {
this.props.history.push('/dashboard');
} else {
alert(
`Something was wrong with your email. Error: ${response.message}`
);
}
} catch (error) {
console.error('Error while sending email!');
console.error(error);
this.setState({ loading: false });
}
}
...
}

有什么想法吗?

最佳答案

这应该让你开始:

import * as React from 'react';
import { shallow } from 'enzyme';

let sendEmail = () => {};

class EmailPage extends React.Component {

formatEmailValues() { return 'formatEmailValues return value'; }

async onSubmit(values, applicaitonId) {
try {
this.setState({ loading: true });
const response = await sendEmail(this.formatEmailValues(values), applicaitonId);
console.log(response)
this.setState({ loading: false });
if (response.status !== 'error') {
this.props.history.push('/dashboard');
} else {
alert(
`Something was wrong with your email. Error: ${response.message}`
);
}
} catch (error) {
console.error('Error while sending email!');
console.error(error);
this.setState({ loading: false });
}
}

render() { return null; }
}

describe('EmailPage', () => {

test('onSubmit', async () => {
const historyMock = { push: jest.fn() };
const wrapper = shallow(<EmailPage history={historyMock} />);
const instance = wrapper.instance();

let sendEmailResolve;
sendEmail = jest.fn(() => new Promise(resolve => { sendEmailResolve = resolve; }));
const formatEmailValuesSpy = jest.spyOn(EmailPage.prototype, 'formatEmailValues');

const promise = instance.onSubmit(['value1', 'value2'], 'applicationId');
expect(wrapper.state().loading).toBe(true); // Success!
expect(formatEmailValuesSpy).toHaveBeenCalledWith(['value1', 'value2']); // Success!
expect(sendEmail).toHaveBeenCalledWith('formatEmailValues return value', 'applicationId'); // Success!

sendEmailResolve({ status: 'success' }); // simulate sendEmail resolving
await promise; // let onSubmit finish

expect(wrapper.state().loading).toBe(false); // Success!
expect(historyMock.push).toHaveBeenCalledWith('/dashboard'); // Success!
})
})

我将把它作为练习留给读者来实现 error 案例。

(...但是为了快速启动这项工作,您需要模拟 global.alert 并调用 sendEmailResolve({ status: 'error' });测试)

关于javascript - Jest/Enzyme 在 try/catch 中用 async/await 方法测试 React 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55286888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com