
[英]testing conditional rendering that relies on state using react testing library
[英]React testing library conditional rendering
我如何在测试库中有条件地进行测试:渲染加载组件骨架正在工作但不知道如何模拟 useState?
const TextComponent = ({text}: WidgetProps): ReactElement => {
const [calculatedData, setCalculatedData] = useState(false)
useEffect(() => {
if (text) {
setCalculatedData(true)
}
}, [])
if (!calculatedData) return <Skeleton className="skeleton-profile" />
return (
<div data-testid="displayText">
{text}
</div>
)
}
组件.test.tsx
describe('basic render', () => {
test('render skeleton', async () => {
const {container} = render(
<Provider store={store}>
<BrowserRouter>
<TextComponent text={text} />
</BrowserRouter>
</Provider>
)
expect(container.getElementsByClassName('skeleton-profile').length).toBe(1)
})
test('render Component', async () => {
const {getByTestId} = render(
<Provider store={store}>
<BrowserRouter>
<TextComponent text={text} />
</BrowserRouter>
</Provider>
)
expect(getByTestId('displayText')).toBeInTheDocument()
})
})
我得到的错误是: TestingLibraryElementError: Unable to find an element by: [data-testid="displayText"]
我认为您的组件不需要本地 state 来处理此逻辑。 您的text
道具与您的calculatedData
state 基本相同。删除本地 state 和useEffect
并直接使用道具作为条件会更有意义,这样也更容易测试:
const TextComponent = ({text}: WidgetProps): ReactElement => {
return text ? (
<div data-testid="displayText">{text}</div>
) : (
<Skeleton className="skeleton-profile" />
)
}
然后在你的测试文件中你只需要编写 2 个测试用例:
text
道具传递给测试中的组件)text
道具传递给测试中的组件)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.