如何测试 renderItem 函数 returns a <ListItem />?
How to test that the renderItem function returns a <ListItem />?
我正在使用 React Native 构建我的应用程序,并使用 Jest 和 Enzyme 进行单元测试。如何测试我的 <FlatList />
的 renderItem()
功能?
它 returns 来自 React-Native-Elements 库的 <ListItem />
。
让我给你示例代码:
import { ListItem } from 'react-native-elements'
export class MyList extends Component {
const list = [
{
name: 'Amy Farha',
subtitle: 'Vice President'
},
{
name: 'Chris Jackson',
avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg',
subtitle: 'Vice Chairman'
},
... // more items
]
keyExtractor = (item, index) => index
renderItem = ({ item }) => (
<ListItem
title={item.name}
subtitle={item.subtitle}
leftAvatar={{
source: item.avatar_url && { uri: item.avatar_url },
title: item.name[0]
}}
/>
)
render () {
return (
<FlatList
keyExtractor={this.keyExtractor}
data={this.state.dataSource}
renderItem={this.renderItem}
/>
)
}
}
我希望能够测试 renderItem()
功能。我的问题是 wrapper.instance().renderItem({item: item})
returns 错误:TypeError: wrapper.instance(...).renderItem(...).find is not a function
。让我给你我写的测试代码:
describe("component methods", () => {
let wrapper;
let props;
let item;
beforeEach(() => {
props = createTestProps();
wrapper = shallow(<MyList {...props} />);
});
describe("renderItem", () => {
describe("user", () => {
beforeEach(() => {
item = {
name: 'Chris Jackson',
avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg',
subtitle: 'Vice Chairman'
};
});
it("should display the order as a <ListItem />", () => {
expect(
wrapper
.instance()
.renderItem(item)
.find("ListItem")
).toHaveLength(1);
});
});
});
});
如何编写此测试才能测试该函数是否正确呈现 <ListItem />
?
所以我不确定您是否从基于 class 的组件中提取了一些代码,但 renderItem
本身就是一个组件。我也许可以给你一些测试代码,你可以根据你的需要调整它,假设你导入了 shallow 并设置了你的项目变量:
describe('renderItem', () => {
it('should display as a ListItem', () => {
const wrapper = shallow(<renderItem item={item} />);
expect(wrapper.find(ListItem).length).toEqual(1);
});
});
有两点与您的示例不同。一 - 我假设您已将 ListItem
导入到您的测试中。然后您可以将其直接传递给 find
。第二位是您想将查找和检查长度的结果传递给 expect
并测试它的值。想想它是 "what I want to test"(它可以找到的 ListItem
个组件的数量),然后创建断言 (toEqual(1)
)。
反映问题编辑的附加信息
在您的设置中,我不会费心直接测试 renderItem
。相反,我会确保对 ListItem
进行全面测试,然后断言 MyList
如何呈现 FlatList
。这可以使用 expect(wrapper).toMatchSnapshot()
来完成,或者通过断言一些关于给予 FlatList
的道具的事情来更好。如果你对这一切真的很偏执,或许可以使用 mount
而不是 shallow 来完全渲染它。
renderItem()
return 是一个 JSX 元素。 JSX compiles to React.createElement() which returns an object.
因此,renderItem()
中的 return 值只是一个对象。
您可以通过执行以下操作来测试 renderItem()
是否创建了正确的对象:
it("should display the order as a <ListItem />", () => {
const element = wrapper
.instance()
.renderItem(item);
expect(element.type).toBe(ListItem);
expect(element.props).toEqual({
title: 'Chris Jackson',
subtitle: 'Vice Chairman',
leftAvatar: {
source: { uri: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg' },
title: 'C'
}
});
});
您可以用 react-native-testing-library
测试 FlatList
示例如下:
组件:
const Item = ({ name ) => <Text>{name}</Text>
class LisItem extends React.Component {
_keyExtractor = (item: { id: string }) => item.id
render() {
return (
<View style={styles.container}>
{todos && (
<FlatList
data={this.props.todos}
keyExtractor={this._keyExtractor}
renderItem={({ item: { id, name } }) => (
<Item
key={id}
name={name}
/>
)}
/>
)}
</View>
)
}
}
单元测试:
import { render } from 'react-native-testing-library'
const mockDataTodos = [
{
id: 'id-1',
name: 'Todo-1',
},
{
id: 'id-2',
name: 'Todo-2',
},
{
id: 'id-3',
name: 'Todo-3',
},
]
describe('Testing FlatList', () => {
test('Error component should be render when error is true', () => {
const componentTree = render(
<ListItem todos={mockDataTodos} />,
)
expect(componentTree.getAllByType(FlatList).length).toBe(1)
expect(componentTree.getAllByType(Item).length).toBe(mockDataTodos.length)
})
})
希望对您有所帮助!
您也可以使用 renderProp
函数进行测试。
const wrapper = shallow(<YourComponent {...defaultProps} />);
const flatList = wrapper.find('FlatList');
const item = flatList.renderProp('renderItem')({ item: yourData });
expect(item).toMatchSnapshot();
我正在使用 React Native 构建我的应用程序,并使用 Jest 和 Enzyme 进行单元测试。如何测试我的 <FlatList />
的 renderItem()
功能?
它 returns 来自 React-Native-Elements 库的 <ListItem />
。
让我给你示例代码:
import { ListItem } from 'react-native-elements'
export class MyList extends Component {
const list = [
{
name: 'Amy Farha',
subtitle: 'Vice President'
},
{
name: 'Chris Jackson',
avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg',
subtitle: 'Vice Chairman'
},
... // more items
]
keyExtractor = (item, index) => index
renderItem = ({ item }) => (
<ListItem
title={item.name}
subtitle={item.subtitle}
leftAvatar={{
source: item.avatar_url && { uri: item.avatar_url },
title: item.name[0]
}}
/>
)
render () {
return (
<FlatList
keyExtractor={this.keyExtractor}
data={this.state.dataSource}
renderItem={this.renderItem}
/>
)
}
}
我希望能够测试 renderItem()
功能。我的问题是 wrapper.instance().renderItem({item: item})
returns 错误:TypeError: wrapper.instance(...).renderItem(...).find is not a function
。让我给你我写的测试代码:
describe("component methods", () => {
let wrapper;
let props;
let item;
beforeEach(() => {
props = createTestProps();
wrapper = shallow(<MyList {...props} />);
});
describe("renderItem", () => {
describe("user", () => {
beforeEach(() => {
item = {
name: 'Chris Jackson',
avatar_url: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg',
subtitle: 'Vice Chairman'
};
});
it("should display the order as a <ListItem />", () => {
expect(
wrapper
.instance()
.renderItem(item)
.find("ListItem")
).toHaveLength(1);
});
});
});
});
如何编写此测试才能测试该函数是否正确呈现 <ListItem />
?
所以我不确定您是否从基于 class 的组件中提取了一些代码,但 renderItem
本身就是一个组件。我也许可以给你一些测试代码,你可以根据你的需要调整它,假设你导入了 shallow 并设置了你的项目变量:
describe('renderItem', () => {
it('should display as a ListItem', () => {
const wrapper = shallow(<renderItem item={item} />);
expect(wrapper.find(ListItem).length).toEqual(1);
});
});
有两点与您的示例不同。一 - 我假设您已将 ListItem
导入到您的测试中。然后您可以将其直接传递给 find
。第二位是您想将查找和检查长度的结果传递给 expect
并测试它的值。想想它是 "what I want to test"(它可以找到的 ListItem
个组件的数量),然后创建断言 (toEqual(1)
)。
反映问题编辑的附加信息
在您的设置中,我不会费心直接测试 renderItem
。相反,我会确保对 ListItem
进行全面测试,然后断言 MyList
如何呈现 FlatList
。这可以使用 expect(wrapper).toMatchSnapshot()
来完成,或者通过断言一些关于给予 FlatList
的道具的事情来更好。如果你对这一切真的很偏执,或许可以使用 mount
而不是 shallow 来完全渲染它。
renderItem()
return 是一个 JSX 元素。 JSX compiles to React.createElement() which returns an object.
因此,renderItem()
中的 return 值只是一个对象。
您可以通过执行以下操作来测试 renderItem()
是否创建了正确的对象:
it("should display the order as a <ListItem />", () => {
const element = wrapper
.instance()
.renderItem(item);
expect(element.type).toBe(ListItem);
expect(element.props).toEqual({
title: 'Chris Jackson',
subtitle: 'Vice Chairman',
leftAvatar: {
source: { uri: 'https://s3.amazonaws.com/uifaces/faces/twitter/adhamdannaway/128.jpg' },
title: 'C'
}
});
});
您可以用 react-native-testing-library
测试FlatList
示例如下:
组件:
const Item = ({ name ) => <Text>{name}</Text>
class LisItem extends React.Component {
_keyExtractor = (item: { id: string }) => item.id
render() {
return (
<View style={styles.container}>
{todos && (
<FlatList
data={this.props.todos}
keyExtractor={this._keyExtractor}
renderItem={({ item: { id, name } }) => (
<Item
key={id}
name={name}
/>
)}
/>
)}
</View>
)
}
}
单元测试:
import { render } from 'react-native-testing-library'
const mockDataTodos = [
{
id: 'id-1',
name: 'Todo-1',
},
{
id: 'id-2',
name: 'Todo-2',
},
{
id: 'id-3',
name: 'Todo-3',
},
]
describe('Testing FlatList', () => {
test('Error component should be render when error is true', () => {
const componentTree = render(
<ListItem todos={mockDataTodos} />,
)
expect(componentTree.getAllByType(FlatList).length).toBe(1)
expect(componentTree.getAllByType(Item).length).toBe(mockDataTodos.length)
})
})
希望对您有所帮助!
您也可以使用 renderProp
函数进行测试。
const wrapper = shallow(<YourComponent {...defaultProps} />);
const flatList = wrapper.find('FlatList');
const item = flatList.renderProp('renderItem')({ item: yourData });
expect(item).toMatchSnapshot();