gpt4 book ai didi

reactjs - 在 dom-testing-library 或 react-testing-library 中测试输入值的最佳方法

转载 作者:行者123 更新时间:2023-12-03 13:56:36 25 4
gpt4 key购买 nike

测试 <input> 值的最佳方法是什么? dom-testing-library 中的元素/react-testing-library ?
我采用的方法是通过 closest() 获取原始输入元素本身。方法,然后我可以直接访问 value属性:

const input = getByLabelText("Some Label")
expect(input.closest("input").value).toEqual("Some Value")
我希望有一种方法可以做到这一点,而无需直接访问 HTML 属性。这似乎不符合测试库的精神。也许类似 jest-dom toHaveTextContent matcher匹配器:
const input = getByLabelText("Some Label")
expect(input).toHaveTextContent("Some Value")

更新
根据评论中的请求,这里是一个代码示例,显示了我觉得需要测试输入框中的值的情况。
这是我在我的应用程序中构建的模态组件的简化版本。喜欢,极其简化。这里的整个想法是,基于字符串 Prop ,模态打开时输入预先填充了一些文本。用户可以自由编辑此输入并通过按按钮提交。但是,如果用户关闭模态然后重新打开它,我希望将文本重置为该原始字符串 Prop 。我为它写了一个测试,因为模态的以前版本 没有重置输入值。
我是用 TypeScript 写的,所以每个 Prop 的类型都非常清楚。
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>
)
}

最佳答案

关于这个测试库希望你如何测试,你对你的测试方法持怀疑态度是正确的。这个问题最简单的答案是使用 getByDisplayValue询问。它将搜索输入,textarea ,或选择具有您要查找的值的值。例如,以您的组件为例,如果我试图验证 inputValue = 'test' ,我想搜索

expect(screen.getByDisplayValue('test')).toBeInTheDocument();
这就是您需要做的所有事情。我假设您的测试仅呈现 MyModal成分。即使您有多个输入,在测试理念方面也无关紧要。只要 getByDisplayValue找到具有该值的任何输入,这是一次成功的测试。如果您有多个输入并想要测试确切的输入是否具有值,那么您可以深入研究元素以确定它是正确的输入:
注意:您需要 jest-dom为了这个工作。
expect(screen.getByDisplayValue('test')).toHaveAttribute('id', 'the-id');
或(没有 jest-dom):
expect(screen.getByDisplayValue('test').id).toBe('the-id');
您当然可以搜索您喜欢的任何属性。
测试值的最后一种替代方法是按角色查找输入。这在您的示例中不起作用,除非您添加标签并通过 htmlFor 将其关联到您的输入中。属性。然后你可以像这样测试它:
expect(screen.getByRole('input', { name: 'the-inputs-id' })).toHaveValue('test');
或(没有 jest-dom):
expect(screen.getByRole('input', { name: 'the-inputs-id' }).value).toBe('test');
我相信这是测试值的最佳方法,同时确保正确的输入具有值。我建议使用 getByRole方法,但同样,您需要为示例添加一个标签。

关于reactjs - 在 dom-testing-library 或 react-testing-library 中测试输入值的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62473970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com