Проверьте, выполняет ли функция диспетчерское действие с шуткой и энзимом - PullRequest
0 голосов
/ 13 июня 2019

У меня есть экран входа, в котором есть метод, который при вызове отправляет действие.Я хочу проверить с помощью шутки и энзима, если при нажатии кнопки вызывается эта функция и, следовательно, отправляется действие.Я пытался разными способами, но не смог этого добиться.

экранов / login.js

import React, { Component } from 'react';
import {
  KeyboardAvoidingView,
  TextInput,
  StyleSheet,
  Text,
  Button,
  TouchableOpacity
} from 'react-native';
import { connect } from 'react-redux';

import { login } from 'actions/sessions.js';

export class LoginScreen extends Component {

  constructor(props){
    super(props);
    this.state = {
      email: '',
      password: '',
      error: ''
    }
  }

  requestLogin = async () => {
    if(this.checkFields()){
      this.setState({error: ''});
      this.props.loginRequest(this.state.email, this.state.password);
    }
  }

  checkFields = () => {
    let { email, password } = this.state;
    const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    if(!re.test(email)){
      this.setState({error: 'E-mail must be valid'})
      return false;
    }else if(email == '' || password == ''){
      this.setState({error: 'All fields are required!'});
      return false
    }else{
      return true;
    }
  }

  handleEmailText = (email) => {
    this.setState({email})
  }

  handlePasswordText = (password) => {
    this.setState({password})
  }


  render(){
    return(
      <KeyboardAvoidingView style={styles.container} enabled={true} behavior="padding">
        <Text>{this.state.error || this.props.error}</Text>
        <TextInput
          onChangeText={(e) => this.handleEmailText(e)}
          value={this.state.email}
          keyboardType="email-address"
          textContentType="emailAddress"
          autoCapitalize="none"
          placeholder="E-mail"
          style={styles.input}
        />
        <TextInput
          onChangeText={(e) => this.handleEmailPassword(e)}
          value={this.state.password}
          placeholder="Password"
          textContentType="password"
          autoCapitalize="none"
          secureTextEntry={true}
          style={styles.input}
        />
        <Button style={styles.button}
          title="Sign In"
          onPress={() => this.requestLogin()}/>
      </KeyboardAvoidingView>
    )
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  input: {
    width: "50%",
    height: 40,
    borderColor: 'gray',
    borderWidth: 1,
    paddingLeft: 20,
    paddingRight: 20,
    margin: 10
  }
})

const mapDispatchToProps = dispatch => {
  return {
    loginRequest: (email, password) => dispatch(login(email, password))
  }
}

const mapStateToProps = state => {
  return {
    error: state.sessions.error
  }
}

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

tests / экранов / login.test.js

import React from 'react';
import { shallow } from 'enzyme';
import toJson from 'enzyme-to-json';
import renderer from 'react-test-renderer';
import configureStore from 'redux-mock-store';

import { LoginScreen } from 'screens/Login';

describe('LoginScreen', () => {


  it('should dispatch login action when button clicked', async () => {
    const mockStore = configureStore();
    const initialState = {};
    const store = mockStore(initialState);
    const wrapper = shallow(<LoginScreen store={store}/>)
    wrapper.setState({email: 'foo@bar.com', password: '1234'})
    const component = await wrapper.dive();
    component.find('button').simulate('click');
    expect(store.getActions()).toMatchSnapshot();
  });

})

Когда у меня такой подход, он говорит, что simulate is meant to be run on 1 node. 0 found instead. Я понятия не имею, как его проверить.

1 Ответ

0 голосов
/ 13 июня 2019

В реакции на натив вы можете использовать:

component.find('Button').props().onPress();

для имитации взаимодействия с пользователем.

Кроме того, вы должны использовать Button вместо button (имя вашего компонента).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...