测试 dom-testing-library
/ react-testing-library
中的 <input>
元素的值的最佳方法是什么?
我采用的方法是通过 closest()
方法获取原始输入元素本身,然后我可以直接访问 value
属性:
const input = getByLabelText("Some Label")
expect(input.closest("input").value).toEqual("Some Value")
我希望有一种方法可以做到这一点,而不必直接访问 HTML 属性。它似乎不符合测试库的精神。也许类似于 jest-dom toHaveTextContent 匹配 器匹配器:
const input = getByLabelText("Some Label")
expect(input).toHaveTextContent("Some Value")
更新
根据评论中的要求,这是一个代码示例,显示了我觉得需要测试输入框中的值的情况。
这是我在我的应用程序中构建的模态组件的简化版本。 就像,非常简化。 这里的整个想法是,模式打开时输入预先填充了一些文本,基于字符串道具。用户可以自由编辑此输入并通过按下按钮提交。但是,如果用户关闭模式然后重新打开它,我希望将文本重置为原始字符串道具。我为它写了一个测试,因为以前版本的模态 没有 重置输入值。
我是用 TypeScript 写的,这样每个道具的类型就很清楚了。
interface Props {
onClose: () => void
isOpen: boolean
initialValue: string
}
export default function MyModal({ onClose, isOpen, initialValue }) {
const [inputValue, setInputValue] = useState(initialValue)
// useEffect does the reset!
useEffect(() => {
if (!isOpen) {
setNameInput(initialValue)
}
}, [isOpen, initialValue])
return (
<SomeExternalLibraryModal isOpen={isOpen} onClose={onClose}>
<form>
<input
value={inputValue}
onChange={(e: ChangeEvent<HTMLInputElement>) =>
setInputValue(e.target.value)
}
/>
<button onClick={onClose}>Cancel</button>
</form>
</SomeExternalLibraryModal>
)
}
原文由 ecbrodie 发布,翻译遵循 CC BY-SA 4.0 许可协议
关于此测试库希望您如何测试,您对测试方法的怀疑是正确的。这个问题最简单的答案是使用
getByDisplayValue
查询。它将搜索输入textarea
,或选择具有您试图查找的值的输入。例如,以您的组件为例,如果我试图验证inputValue = 'test'
,我会这样搜索这就是您需要做的全部。我假设您的测试仅渲染
MyModal
组件。即使您有多个输入,在测试理念方面也没有关系。只要getByDisplayValue
找到具有该值的任何输入,它就是一个成功的测试。如果您有多个输入并且想要测试确切的输入是否具有值,那么您可以深入研究元素以确定它是正确的输入:注意:您需要
jest-dom
才能正常工作。或者(没有
jest-dom
):您当然可以搜索您喜欢的任何属性。
测试值的最后一个替代方法是按角色查找输入。除非您添加标签并通过
htmlFor
属性将其关联到您的输入,否则这在您的示例中不起作用。然后你可以像这样测试它:或者(没有
jest-dom
):我认为这是测试值的最佳方式,同时确保正确的输入具有值。我会建议
getByRole
方法,但同样,您需要为示例添加标签。