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

新手上路,请多包涵

测试 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 许可协议

阅读 839
1 个回答

关于此测试库希望您如何测试,您对测试方法的怀疑是正确的。这个问题最简单的答案是使用 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 方法,但同样,您需要为示例添加标签。

原文由 Devin Fields 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进