React 测试库:检查多个元素是否有 href
React Testing Library : check if multiple elements have href
我想检查 <ul>
中的所有链接是否都具有 href
属性。
组件(使用 Gatsby 的 <Link>
):
const DropdownMenu = ({ open }) => {
return (
<ul className="dropdown-menu">
{open && (
<>
<li>
<Link to="/link1/">Link 1</Link>
</li>
<li>
<Link to="/link2/">Link 2</Link>
</li>
<li>
<Link to="/link3/">Link 3</Link>
</li>
</>
)}
</ul>
)
}
呈现 HTML :
...
<ul
class="dropdown-menu"
>
<li>
<a
href="/link1/"
>
Link 1
</a>
</li>
<li>
<a
href="/link2/"
>
Link 2
</a>
</li>
<li>
<a
href="/link3/"
>
Link 3
</a>
</li>
</ul>
...
测试:
test('links have href', () => {
render(<DropdownMenu open={true}></DropdownMenu>)
const listLinks = screen.getAllByRole('link')
expect(listLinks).toHaveAttribute('href')
})
输出:
received value must be an HTMLElement or an SVGElement.
Received has type: array
Received has value: [<a href="/link1/">Link 1</a>, <a href="/link2/">Link 2</a> ...]
有没有办法(比如 map
之类的)检查所有元素是否都正确 href
?
我可能在这里使用了错误的方法。
如错误所述,.toHaveAttribute
应在 HTMLElement
上调用,但您在 listLinks
上调用它,它是 HTMLElement
的数组(HTMLElement[]
).
如果你真的想测试每个 link 的 href
值,你只需要在循环中进行断言:
listLinks.forEach((link) => {
expect(link).toHaveAttribute('href', expected);
});
恐怕没有 map
之类的实用方法可用于此用例。
话虽这么说,如果没有条件将每个 to
属性设置为 links(就像你在这里分享的代码),我认为这个测试是没有必要的。
您在这里实际测试的是 Gatsby Link
将正确的 href
属性设置为已通过的 to
道具生成的 link,但这在理论上是 none 你的业务,Gatsby 已经确保它正常工作。
在我看来,你应该测试的是 you 定义的逻辑:如果 open
prop 是 true
,确保呈现 links。
其余的是为了额外的安全,但可能没有必要。
.forEach
在 Jest 中可能会产生误报,请改用 it.each
我想检查 <ul>
中的所有链接是否都具有 href
属性。
组件(使用 Gatsby 的 <Link>
):
const DropdownMenu = ({ open }) => {
return (
<ul className="dropdown-menu">
{open && (
<>
<li>
<Link to="/link1/">Link 1</Link>
</li>
<li>
<Link to="/link2/">Link 2</Link>
</li>
<li>
<Link to="/link3/">Link 3</Link>
</li>
</>
)}
</ul>
)
}
呈现 HTML :
...
<ul
class="dropdown-menu"
>
<li>
<a
href="/link1/"
>
Link 1
</a>
</li>
<li>
<a
href="/link2/"
>
Link 2
</a>
</li>
<li>
<a
href="/link3/"
>
Link 3
</a>
</li>
</ul>
...
测试:
test('links have href', () => {
render(<DropdownMenu open={true}></DropdownMenu>)
const listLinks = screen.getAllByRole('link')
expect(listLinks).toHaveAttribute('href')
})
输出:
received value must be an HTMLElement or an SVGElement.
Received has type: array
Received has value: [<a href="/link1/">Link 1</a>, <a href="/link2/">Link 2</a> ...]
有没有办法(比如 map
之类的)检查所有元素是否都正确 href
?
我可能在这里使用了错误的方法。
如错误所述,.toHaveAttribute
应在 HTMLElement
上调用,但您在 listLinks
上调用它,它是 HTMLElement
的数组(HTMLElement[]
).
如果你真的想测试每个 link 的 href
值,你只需要在循环中进行断言:
listLinks.forEach((link) => {
expect(link).toHaveAttribute('href', expected);
});
恐怕没有 map
之类的实用方法可用于此用例。
话虽这么说,如果没有条件将每个 to
属性设置为 links(就像你在这里分享的代码),我认为这个测试是没有必要的。
您在这里实际测试的是 Gatsby Link
将正确的 href
属性设置为已通过的 to
道具生成的 link,但这在理论上是 none 你的业务,Gatsby 已经确保它正常工作。
在我看来,你应该测试的是 you 定义的逻辑:如果 open
prop 是 true
,确保呈现 links。
其余的是为了额外的安全,但可能没有必要。
.forEach
在 Jest 中可能会产生误报,请改用 it.each