javascript - 如何测试单击选择的下拉选项?
问题描述
我正在使用@testing-library/react
for React 16.4.0
&编写一个测试react-scripts 4.0.1
来测试select
下拉菜单的功能。
我希望测试运行器单击select
下拉菜单,然后单击其子级 value regular
。但是,我似乎无法options
在测试中捕获 select 的 DOM 元素:
// Toolbar.test.tsx
render(<Toolbar/>)
const difficultySelect = screen.getByLabelText('difficulty')
console.log(difficultySelect.children)
// => HTMLCollection {}
奇怪的是,如果我使用以下代码检查 DOM,我确实返回了预期值( 的数组options
):
// in browser console
const toggler = document.querySelector('toolbar-toggler');
toggler.children
// => HTMLCollection(4) [option, option, option, option]
我做了一些研究,我的直觉是我应该useRef
用来访问select
工具栏options
。但是我一直在努力实现这一点。
实际组件代码如下:
// Toolbar.tsx
function Toggler({setting, options}: { setting: string, options: string[]}) {
const handleChange = (option: string) => {
// ... snip ...
}
return (
<div key={setting} className={`${setting}-select-container`}>
<label htmlFor={setting}>{setting}</label>
<select id={setting} data-testid='toolbar' key={setting} onChange={(event) => handleChange(event.target.value)}>
{
options.map((option: any, index: number) => (
<option value={option} key={index}>{option}</option>
))
}
</select>
</div>
)
}
解决方案
访问该<select />
元素后,您可以在其上触发单击事件,然后获取您想要单击的所需选项。
// In your test case
render(<Toolbar options={['easy', 'regular', 'hard']} setting="difficulty" />)
const difficultySelect = screen.getByLabelText('difficulty')
fireEvent.click(difficultySelect)
const regularOption = screen.getByRole('option', { name: 'regular' })
fireEvent.click(regularOption)
理想情况下,您希望测试遵循与用户与 UI 元素交互一样的步骤。
推荐阅读
- swift - 在 iOS 上未收到 Flutter FCM 推送通知
- asp.net - 无法将 PHP 生成的 JSON 解析为 .NET 对象。总是空的
- r - 按重置时插入消息并删除日历
- java - 如何在这里删除最后一个节点?爪哇
- javascript - Fabric.js Canvas - 使一种对象始终位于另一种对象下方
- wordpress - 如何使用全局 $wpdb 查询运行 SQL 查询并回显结果
- ms-word - MS Word 中编号的分层标题和列表
- mqtt - Laravel MQTT 订阅 - 未定义索引:qos
- node.js - TypeError:无法在身份验证时读取未定义的属性“jwtoken”
- sparql - 如何在 RDF 中存储条件数据