javascript - React 测试:是否应该测试文本内容?
问题描述
应该测试元素的文本内容,还是只测试其可见性?我认为这是一个实现细节的问题。
例子:
it('renders post body', async () => {
getPost.resolves(fakePost)
const { getByTestId } = render(<Post />)
await wait(() => getByTestId('post-body'))
expect(getByTestId('post-body')).toBeVisible()
// Should this next line be included?
expect(getByTestId('post-body')).toHaveTextContent(fakePost.body)
})
我觉得这是一个关于如何呈现正文文本的实现细节,我应该只关心是否呈现了某些内容。
例如,接下来我想将正文文本存储为 markdown 并将其呈现为 HTML。要实现这一点,我必须首先更改测试,因为存储的文本将不再等于 DOM 中呈现的内容。
但是,如果只测试渲染元素的可见性,并不能保证该元素实际上包含任何内容。我觉得测试应该比那更安全。
expect(getByTestId('post-body')).not.toBeEmpty()
在jest-dom api中想到了,但即使该元素仅包含另一个没有实际文本内容的元素,也会通过。
解决方案
特别感谢指导原则,我认为可以公平地说,如果您以与指导人类在生产中测试它的方式相同的方式测试您的组件或应用程序,那么您就做对了。
如果您的组件正在接受 API 调用,并将其格式化为 Markdown,那么您应该测试它实际上是否正确发生。组件如何呈现(并在您的测试中模仿它)是测试实现细节的一个示例。测试组件呈现的内容不是。
我知道这是一条很好的线路,但我认为您应该包括最后一行。我还认为,如果您能找到一种通过test-id 以外的方式进行查询的方法,那就太好了。
推荐阅读
- javascript - d3折线图-对象挖掘
- asp.net - ASP 核心。多个身份的最佳实践
- typescript - 打字稿允许类属性具有多种类型
- php - PHP:希伯来字母比较
- javascript - 如何正确地对我的 API 客户端文件下载功能进行单元测试?
- python - tweepy twitter api 流状态对象与 api 搜索状态对象 - timestamp_ms / created_at 区别?
- javascript - JavaScript 中的时间戳间隔
- firebase - firebase blaze plan升级后直接拿钱,没等到月底
- python - 屏蔽和查询 pandas.DataFrame 的区别
- python - 在 PyCharm 调试器中运行时找不到 Azure 存储的 Python 模块