Я пытаюсь протестировать компонент класса, которому нужны некоторые реквизиты для рендеринга 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 с поддельными данными не имеет места в объекте реквизита ... мне кажется правильным
хорошо, только что сделал это





Поскольку PokemonDetail является компонентом, подключенным к Redux, а реквизит pokemon обрабатывается Redux, реквизит в <PokemonDetail pokemon = {mockPokemon} /> будет переопределен Redux.
Вместо этого объект должен быть передан как часть хранилища Redux:
const store = mockStore({ pokemon: mockPokemon });
const wrapper = mount(
<Provider store = {store}>
<PokemonDetail />
</Provider>
);
Пожалуйста, предоставьте весь компонент, который вы тестируете. Я ожидаю, что проблема специфична для Redux.