我正在按照react-testing-library的文档查找是否呈现了具有data-testid
属性的元素。
即使元素存在,React测试库也无法找到该元素。
测试
test('Renders step based on the active step', () => {
render(<RenderStep />, { initialState: { implOnboard: initialState } });
});
expect(screen.getByTestId('step-1')).toBeDefined(); // 👉 THROWS ERROR ❌
}
组成部分
// redux
const { activeStep } = useSelector((state) => state.implOnboard);
const renderStep = () => {
switch (activeStep) {
case 1:
console.log('Rendering this 🔥'); // 👈 THIS IS GETTING LOGGED TOO!
return (
<div data-testid="step-1">
<StepOne />
</div>
);
case 2:
return (
<div data-testid="step-2">
<StepTwo />
</div>
);
}
};
return <React.Fragment>{renderStep()}</React.Fragment>;
错误
TestingLibraryElementError: Unable to find an element by: [data-testid="step-1"]
型
4条答案
按热度按时间8dtrkrch1#
请使用
queryByTestId
代替getByTestId
用于该情况。它将工作。wgx48brx2#
Elena的回答是错误的,只是掩盖了错误,如果没有找到元素,使用
queryByTestId
将返回null,而不是使用getByTestId
时的错误,Assert实际上将是:而这将通过。这不是测试任何东西。
toBeDefined()
只有在元素等于undefined时才会失败,其他一切都通过。如果OP希望实际检查该元素是否不存在,则应执行以下操作:
OP中的原始错误可能是因为expect在测试块之外而发生的。
wh6knrhe3#
除了Elena的回答,我们还需要使用
queryByTestId
,因为如果元素未找到,queryByTestId
将返回null
值,而不是像getByTestId
那样抛出错误。有时候,即使在使用
queryBy
时也会出现错误,因此请在执行此语句之前检查其他代码。参考-https://www.youtube.com/watch?v=Yghw9FkNGsc&list=PL4cUxeGkcC9gm4_-5UsNmLqMosM-dzuvQ&index=5&ab_channel=TheNetNinja
ar5n3qh54#
对于那些使用React Native Web的用户,您需要使用
testID
,它将在元素上编译为data-testid
。它需要位于react Native元素上,而不是您的自定义元素上(将其作为prop传递并放置在View上,等等)。