React Native / Jest TypeError: Невозможно прочитать свойство 'params' из undefined - тестирование с помощью jest - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь создать тест в приложении с помощью jest, и это несколько строк моего кода:

import React, { Component } from 'react';
import {...} from 'react-native';
import jwt_decode from 'jwt-decode';

class CreateProduct extends Component {
constructor(props) {
  super(props);
  this.keyboardHeight = new Animated.Value(0);
  this.imageHeight = new Animated.Value(199);
  this.state = {
    isButtonsHidden: false,
    title: '',
    price: '',
    description: '',
    isDialogVisible: false,
    messageError: '',
  };
}

_goBack = async () => {
  const {state} = this.props.navigation;
  var token = state.params ? state.params.token : undefined;

  this.props.navigation.navigate('MyProducts', {token:token});
}

Я хочу проверить навигацию:

this.props.navigation.navigate('MyProducts', {token:token});

Теперь это попытка проверить:

describe('Testing navigation', () =>{

  let wrapper = null
  const spyNavigate = jest.fn()
  const props = {
    navigation:{
        navigate: spyNavigate
    }
  }
  const params = {
      token: 'randomToken'
  }

  beforeEach(() => {
    wrapper = shallow(<CreateProduct {...props}/>)
    wrapper.setState({params: params})
  })

  it('should test navigation', () => {
  wrapper.instance()._goBack(params)
  expect(spyNavigate).toHaveBeenCalled()
  })
})

Но я получаю эту ошибку .

Я предполагаю, что есть ошибка с тем, как япроезжаю const params.Можете ли вы помочь мне рассказать, как лучше всего это сделать, чтобы смоделировать токен и как я могу перемещаться по экрану?

Спасибо.

1 Ответ

0 голосов
/ 09 ноября 2018

Rootcause ваш _goBack является async. Но вы не ждете, пока все закончится, прежде чем запустить expect. Более того: Jest также не ждет завершения _goBack, поэтому вы даже не видите ошибку

Невозможно прочитать свойство 'params' из неопределенного

это происходит потому, что вы не издеваетесь state в navigation.params.

Для работы с асинхронным кодом в Jest существует 2 различных подхода: либо возвращение Promise из it(), либо запуск done() обратного вызова вручную (он передается как 1-й аргумент в it()).

Я выберу 2-е, так как это позволяет нам также ждать, пока goBack не закончится перед запуском expect:

describe('Testing navigation', () => {

  let wrapper = null
  const spyNavigate = jest.fn()
  const props = {
    navigation: {
      navigate: spyNavigate,
      state: {}
    }
  }
  const params = {
    token: 'randomToken'
  }

  beforeEach(() => {
    wrapper = shallow(<CreateProduct {...props} />)
    wrapper.setState({ params: params })
  })

  it('should test navigation', async () => {
    await wrapper.instance()._goBack(params)
    expect(spyNavigate).toHaveBeenCalled()
  })
})

Или без использования async/await это будет выглядеть как

  it('should test navigation', () => {
    return wrapper.
        instance()._goBack(params).
        then(() => expect(spyNavigate).toHaveBeenCalled());
  })

выглядит грязно

Или с помощью done() обратного вызова

  it('should test navigation', (done) => {
      wrapper.
        instance()._goBack(params).
        then(() => expect(spyNavigate).toHaveBeenCalled()).
        then(done);
  })
...