Передача реквизита для реакции компонента на тест

Я пытаюсь протестировать компонент класса, которому нужны некоторые реквизиты для рендеринга html, не уверен, почему он не работает. Я начинаю тесты с шутки и реагирую сейчас, так что я не очень опытен. Чего мне не хватает?

Тестовый компонент

const mockStore = configureMockStore();
const store = mockStore({});
describe("Pokemon detail", () => {
    const mockPokemon =  {
        sprites: {
            back_default:
              "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/132.png"
          },
          name: "ditto",
          abilities: [
            {
              ability: {
                name: "imposter",
                url: 'https://pokeapi.co/api/v2/ability/150/"'
              }
            },
            {
              ability: {
                name: "imposter",
                url: "https://pokeapi.co/api/v2/ability/150/"
              }
            }
          ],
          types: [
            {
              type: {
                name: "normal"
              }
            }
          ]

      }
  const wrapper = mount(
    <Provider store = {store}>
      <PokemonDetail pokemon = {mockPokemon} />
    </Provider>
  );
  expect(wrapper).toMatchSnapshot();
});

сообщение об ошибке это

TypeError: Cannot read property 'sprites' of undefined

         render() {
          <h1>oi</h1>
        if (this.props.pokemon.sprites) {
                                 ^
      const habilidades = this.props.pokemon.abilities.map(element => {
            return <li key = {element.ability.url}>{element.ability.name}</li>;
         });

проверенный компонент

class PokemonDetail extends React.Component {
  render() {
    if (this.props.pokemon.sprites) {
      const habilidades = this.props.pokemon.abilities.map(element => {
        return <li key = {element.ability.url}>{element.ability.name}</li>;
      });
      const tipos = this.props.pokemon.types.map(element => {
        return <li key = {element.type.url}>{element.type.name}</li>;
      });

      return (
        <div className = "ui card">
          <div className = "image">
            <img src = {this.props.pokemon.sprites.back_default} />
          </div>
          <div className = "content">
            <a className = "header">{this.props.pokemon.name}</a>
          </div>
          <button
            onClick = {() => this.props.favoritePokemon(this.props.pokemon.name)}
            className = "ui button primary"
          >
            Add
          </button>
        </div>
      );
    }
    return <div />;
  }
}
const mapStateToProps = state => {
  return { pokemon: state.pokemon };
};
export default connect(mapStateToProps,{favoritePokemon})(PokemonDetail);

Не уверен, почему mockPokemon с поддельными данными не имеет места в объекте реквизита ... мне кажется правильным

Пожалуйста, предоставьте весь компонент, который вы тестируете. Я ожидаю, что проблема специфична для Redux.

Estus Flask 06.02.2019 12:11

хорошо, только что сделал это

Daniel Bezerra De Menezes 06.02.2019 12:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
860
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку PokemonDetail является компонентом, подключенным к Redux, а реквизит pokemon обрабатывается Redux, реквизит в <PokemonDetail pokemon = {mockPokemon} /> будет переопределен Redux.

Вместо этого объект должен быть передан как часть хранилища Redux:

  const store = mockStore({ pokemon: mockPokemon });

  const wrapper = mount(
    <Provider store = {store}>
      <PokemonDetail />
    </Provider>
  );

Другие вопросы по теме