Jestem nowy na Jest + Enzyme i robiłem trochętestuj w mojej aplikacji, wszystko było dobrze, dopóki nie spróbowałem przetestować zdarzenia onPress w jednym z moich komponentów, który renderuje ScrollView, który ma wewnątrz ListItem. Błąd jest: Cannot read property "items" of undefined
Poniżej znajduje się mój kod:
List.js
import React from "react";
import { Text, StyleSheet, Image, View, ScrollView, Alert} from "react-native";
import { ListItem, Button, Card } from "react-native-elements"
import {observer, inject} from "mobx-react";
import {StackNavigator} from "react-navigation";
@inject("ItemStore")
@observer
export default class List extends React.Component{
constructor(props){
super(props);
this.state = {
itemsSelected: [],
}
}
displayItem(item, index){
const {navigate} = this.props.navigation;
this.props.ItemStore.ItemStore.itemSelected(item);
navigate("OtherComp", {"index": index});
}
render(){
return(
<ScrollView>
{
this.props.ItemStore.items.length ?
this.props.ItemStore.items.map((item, i) => (
<ListItem roundAvatar avatar = {{uri: item.photo_uri}}
title = {item.name}
key = {i}
onPress = {this.displayItem.bind(this, item, i)}
onLongPress = {this.setitem.bind(this, i)}
containerStyle = {{ backgroundColor: this.state.itemsSelected.indexOf(i) >= 0 ? "#f1f1f1" : "#ffffff"}}
/>
)) : undefined
}
</ScrollView>
);
}
}
List.test.js
import "react-native";
import React from "react";
import Enzyme from "enzyme";
import MyList from "../../components/list/List";
import {shallow} from "enzyme";
import Adapter from "enzyme-adapter-react-16";
import sinon from "sinon";
import { ListItem } from "react-native-elements"
const ItemStore = require("../../stores/ItemStore").default;
Enzyme.configure({adapter: new Adapter()});
describe("ItemList", () => {
it("click list item", () => {
const wrapper = shallow(<MyList ItemStore={ItemStore.ItemStore} />)
const render = wrapper.dive();
const displayItem = sinon.spy(MyList, "displayItem");
render.find(ListItem).forEach(child => {
child.simulate("onPress");
});
expect(displayItem.calledOnce).toBe(true);
});
});
„Używam wielu sklepów, które powodują wywołanie” store.store
Odpowiedzi:
0 dla odpowiedzi № 1Czy to nie powinno:
this.props.ItemStore.items.length
Być..
this.props.ItemStore.ItemStore.items.length?