【发布时间】:2021-05-08 14:35:44
【问题描述】:
这是一个简单的子组件,当单击按钮时,它会向问题显示answer:
const Question = ({ question, answer }) => {
const [showAnswer, setShowAnswer] = useState(false)
return (
<>
<article>
<header>
<h2 data-testid="question">{question}</h2>
<button onClick={() => setShowAnswer(!showAnswer)}>
{
!showAnswer ? <FiPlusCircle /> : <FiMinusCircle />
}
</button>
</header>
{
showAnswer && <p data-testid="answer">{answer}</p>
}
</article>
</>
)
}
export default Question;
我正在尝试测试当点击button 时,附加的onClick 会被调用一次,并且屏幕上会出现<p> 元素:
const onClick = jest.fn()
test('clicking the button toggles an answer on/off', () => {
render(<Question />);
const button = screen.getByRole('button')
fireEvent.click(button)
expect(onClick).toHaveBeenCalledTimes(1);
expect(screen.getByTestId('answer')).toBeInTheDocument()
fireEvent.click(button)
expect(screen.getByTestId('answer')).not.toBeInTheDocument()
screen.debug()
})
RTL 表示根本不调用 onClick(在 UI 中它是,因为结果符合预期)
另外,如果我想测试这个按钮是否真的切换了answer 元素(消息应该打开和关闭),我将如何测试?
如果我在测试中添加另一个fireEvent.click()(模拟第二次点击应该触发answer元素关闭的按钮),然后添加
expect(screen.getByTestId('answer')).not.toBeInTheDocument()
RTL 将无法找到该元素(我猜这很好,这意味着它已经真正关闭了 DOM)。对于这种情况,您会使用什么断言来通过此测试?
【问题讨论】:
标签: reactjs jestjs react-testing-library