gpt4 book ai didi

reactjs - 测试 React Redux - 无法读取未定义的属性或未定义的包装器

转载 作者:行者123 更新时间:2023-11-28 19:58:54 24 4
gpt4 key购买 nike

我在为我的测试套件在我的组件中设置 Redux 存储时遇到了一些问题。问题是,即使我尝试未连接的挂载,测试也会抛出在 authState 中查找变量的错误。我有以下组件:

import React, { Component } from 'react';
import { Link, Redirect } from "react-router-dom";
import {bindActionCreators} from 'redux';
import {connect} from 'react-redux';
import * as authActions from '../../../actions/auth.actions';

export class PasswordReset extends Component {
constructor(props) {
super(props);
this.state = {
email: '',
emailConfirm: '',
message: ""
};
}

handleChange = e => {
e.preventDefault();
const { value, name } = e.target;

if (name === 'email') {
this.setState({...this.state, email: value.trim()});
} else if (name === 'secondary') {
this.setState({...this.state, emailConfirm: value.trim()});
}
}

handleSubmit = e => {
e.preventDefault();
if (this.state.email.length === 0 && this.state.emailConfirm.length === 0) {
this.setState({message: "Please Enter and Confirm Email Before Submit"});
return;
}

if (this.state.email !== this.state.emailConfirm) {
this.setState({message: 'Emails Do Not Match, Please Try Again'});
return;
}

this.props.authActions.resetPassword(this.state.email);
}

render() {
if (this.props.authState.resetStatus === 'reset') {
return <Redirect to='/login' />
}
const error = this.props.authState.resetError === 'TypeError: Failed to fetch' ? 'Agent Id does not exist' : false
return (
<div className={'container-login100'}>
<div className={'wrap-login100 p-t-85 p-b-20'}>
<form className={'login100-form validate-form'}>
<span className={'login100-form-title p-b-70'}>Reset Password</span>
<div className={'wrap-input100 validate-input m-t-85 m-b-35'}>
<div style={{margin: '0 auto', alignItems: 'center', justifyContent: 'center', display: 'flex', color: 'red'}}>
{error || this.state.message}
</div>
<input
onChange={e => this.handleChange(e)}
className={'input100'}
name='email'
value={this.state.email}
placeholder="Please Enter Your Email"
required
/>
</div>
<div className={'wrap-input100 validate-input m-t-85 m-b-35'}>
<input
onChange={e => this.handleChange(e)}
className={'input100'}
name="secondary"
value={this.state.secondary}
placeholder="Please Confirm By Re-entering Your Email"
required
/>
</div>
<div className={'container-login100-form-btn'}>
<button className={'login100-form-btn btn-disabled'} onClick={e => this.handleSubmit(e)}>Reset Password</button>
</div>
<div className={'container-login100-form-btn'}>
<Link to='/login'>Back to Login</Link>
</div>
</form>
</div>
</div>
)
}
}

const mapStateToProps = state => ({
authState: state.auth,
})

const mapDispatchToProps = dispatch => ({
authActions: bindActionCreators({resetPassword: authActions.resetPassword}, dispatch),
})

export default connect(mapStateToProps, mapDispatchToProps)(PasswordReset);

以及以下测试结构:

import React from 'react';
import configureStore from 'redux-mock-store';
import Enzyme, {mount, shallow} from 'enzyme';
import Provider from 'react-redux';
import Adapter from 'enzyme-adapter-react-16';

import ConnectedPasswordReset, {PasswordReset} from '../';

Enzyme.configure({adapter: new Adapter()});

const mockStore = configureStore();
let wrapper, store, mWrapper;
const initialState = {isLoggedIn: false, isInProgress: false, email: null, error: null, resetError: null, resetStatus: null};

describe('PasswordReset component', () => {
beforeEach(() => {
store = mockStore(initialState);
wrapper = shallow(<PasswordReset store={store} />);
mWrapper = mount(<Provider store={store}><ConnectedPasswordReset /></Provider>);
})

it('shallow - should have initial state.email of ""', () => {
expect(wrapper.state().email).toEqual('');
});

it('mount - should have a initial state.email of ""', () => {
expect(mWrapper.state().email).toEqual('');
});
});

我得到以下输出:

testing output

最佳答案

这是最终对我有用的设置。您也可以使用 mount,但您需要导入路由器并将组件包装在其中。

import React from 'react';
import Enzyme, { shallow } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import { PasswordReset } from '../';

Enzyme.configure({adapter: new Adapter()});

const setup = () => {
let props = {
authState: {
isLoggedIn: false,
isInProgress: false,
email: null,
error: null,
resetError: null,
resetStatus: null
},
authActions: {
login: jest.fn(),
resetPassword: jest.fn()
}
}

let resetWrapper = shallow(<PasswordReset {...props}/>);

return {props, resetWrapper};
};

describe('PasswordReset component', () => {
const {resetWrapper} = setup();

describe('initial render', () => {
it('should have initial state.email of ""', () => {
expect(resetWrapper.state('email')).toEqual('');
});

it('should have a initial internal state.emailConfirm of ""', () => {
expect(resetWrapper.state('emailConfirm')).toEqual('');
});

it('should have one form component', () => {
expect(resetWrapper.find('form').length).toBe(1);
})

it('should have two input fields', () => {
expect(resetWrapper.find('input').length).toBe(2);
});
});
});

关于reactjs - 测试 React Redux - 无法读取未定义的属性或未定义的包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565280/

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