问题:
我有一个项目列表,我想通过每个项目name
值(字符串)进行测试。我正在使用@testing-library/react
并使测试套件正常工作,但我无法使我的测试正常工作。
概述:
- 每个
item
的测试ID为data-testid="side-menu-link"
。这是否必须是唯一的,或者可以按原样进行测试? - menuItems由
Dashboard
、Settings
、User Preferences
等字符串组成
DisplayItems.test.tsx:
// Imports: Dependencies
import React from 'react';
import { render, screen } from '@testing-library/react';
// Imports: App
import App from '../../App';
// Side Menu: Dashboard
test('Renders Dashboard correctly', () => {
// Render: App
const { getByTestId } = render(<App />);
// Expect
expect(getByTestId('side-menu-link')).toHaveAttribute('Dashboard')
});
// Side Menu: User Preferences
test('Renders Dashboard correctly', () => {
// Render: App
const { getByTestId } = render(<App />);
// Expect
expect(getByTestId('side-menu-link')).toHaveAttribute('User Preferences')
});
Map项:
// Map Menu Items
return menuItems.map((menuItem, i) => {
return (
<Link data-testid="side-menu-link" key={i} href="#" className="side-menu-link" to={`/${menuItem.itemName}`}>
<div className={props.currenttab === `${menuItem.itemName}` ? 'side-menu-item-container-selected-light' : 'side-menu-item-container-light'}>
{menuItem.itemIcon}
<p className={props.currenttab === `${menuItem.itemName}` ? 'side-menu-title-selected-light' : 'side-menu-title-light'}>{menuItem.itemName}</p>
</div>
</Link>
);
});
2条答案
按热度按时间fgw7neuy1#
您可以有多个
testID
。否则,不会有__AllByTestId
选择器。这个名字似乎没有经过深思熟虑,因为它与HTMLID相似,必须是唯一的。如果您使用
__ByTestId
,但您有多个元素具有匹配的测试ID,则会发生抛出:要测试Map,您可以将测试ID添加到子Map并使用上面的模式。
原生React:
React:
还可以将
testID
添加到Map列表元素的父级,选择父级,然后遍历其.children
数组以对每个子树进行Assert。注意RN中的
testID
和Reaction中的data-testid
之间的差异。顺便说一句,我不确定
这一点很有道理。属性是
<div this_is_an_attribute="foo">
--您可能正在寻找文本内容。使用的包,供参考:
React原生
React
ws51t4hk2#
每个
item
具有测试IDdata-testid="side-menu-link"
。这是否必须是唯一的,或者可以按原样进行测试?测试ID必须是唯一的。我看到你在用
getByTestId
。根据文档介绍,getBy*
查询返回查询的第一个匹配节点,如果没有元素匹配,则抛出错误,或者如果找到多个匹配,则抛出错误。因此,您的代码将抛出一个错误(假设列表包含多个元素)。但是,即使RTL没有抛出错误,测试ID应该是唯一的也是有意义的。否则,您将如何区分测试中的两个不同元素?
如果出于某种原因,您仍然希望测试ID相同,则需要使用不同的查询,如
getAllBy*
、queryBy*
或queryAllBy*
。同样,请参阅the documentation以了解更多信息。