我已经在堆栈溢出问题上进行了搜索,但是找不到与我的用例相似的东西。
我有这样的容器组件。
import React, { Component } from 'react'; import PropTypes from 'prop-types'; // API import BookingAPI from '../../../../api/BookingAPI'; class CustomerProfilePage extends Component { state = { list: [], totalRecords: 0, pageNo: 1, }; componentDidMount() { const { pageNo } = this.state; this.onGetBookingList({ pageNo }); } onGetBookingList = async ({ pageNo = 0 }) => { const { match } = this.props; try { const result = await BookingAPI.onGetBookingList({ passengerId: match.params.customerId, sortProperties: ['id'], limitCount: 10, pageNo, }); this.setState({ list: result.items, totalRecords: result.totalRecords, }); } catch (error) { // console.log('error is', error); } }; render() { return <div></div>; } } export default CustomerProfilePage;
我想BookingAPI.onGetBookingList用我的this.onGetBookingList方法进行测试。
BookingAPI.onGetBookingList
this.onGetBookingList
到目前为止,这是我尝试过的,我是否在这里遗漏了什么。
这是我CustomerProfilePage.test.js下面的文件
CustomerProfilePage.test.js
import React from 'react'; import { shallow } from 'enzyme'; // Components import CustomerProfilePage from './CustomerProfilePage'; function setup() { const props = { match: { params: { customerId: 1, }, }, }; return shallow(<CustomerProfilePage {...props} />); } describe('CustomerProfilePage', () => { it('Should update state on onGetBookingList call', async () => { jest.mock('../../../../api/BookingAPI', () => ({ onGetBookingList: () => { const data = { items: [{ value: 1 }, { value: 2 }], totalRecords: 1 }; return jest.fn().mockReturnValue(data); }, })); const wrapper = setup(); await wrapper.instance().onGetBookingList({ pageNo: 1 }); wrapper.update(); expect(wrapper.state().totalRecords).toBe(1); // should be 1, but is 0 }); });
为了简单起见,我没有编写代码,render因为我想专注于模拟API调用的代码部分。
render
由于onGetBookingList必须是异步功能
onGetBookingList
您可以这样定义异步方法:
jest.mock('../../../../api/BookingAPI', () => ({ async onGetBookingList() { return data; } }));
或者您可以使用jest.fn()重新调整Promise
jest.mock('../../../../api/BookingAPI', () => ({ onGetBookingList: jest.fn(() => Promise.resolve(data)) }));
或使用jest.fn()。mockResolvedValue()
jest.mock('../../../../api/BookingAPI', () => ({ onGetBookingList: jest.fn().mockResolvedValue(data) }));
然后
import { onGetBookingList } from '../../../../api/BookingAPI'; it('should be working with all of the above mocks', async () => { const { totalRecords } = await onGetBookingList(); expect(totalRecords).toBe(1); }
工作实例