fireEvent.click(el) bắn đúng một DOM event vào element. userEvent.click(el) mô phỏng cả chuỗi tương tác mà trình duyệt sinh ra khi người dùng thật click: pointerdown, mousedown, focus, pointerup, mouseup, click.
const user = userEvent.setup() // call once per test
await user.click(screen.getByRole("button", { name: /submit/i }))
await user.type(screen.getByLabelText("Email"), "a@b.com")Khác biệt thấy rõ trong thực tế:
- fireEvent.change(input, { target: { value: "abc" } }) gán thẳng giá trị, không phát keydown/keyup. Component nghe phím (autocomplete, mask số điện thoại, đếm ký tự) sẽ không chạy đúng.
- userEvent.click tôn trọng disabled và pointer-events: none — click vào nút disabled thì không có gì xảy ra, giống thật. fireEvent vẫn bắn event.
- userEvent tự lo focus/blur, nên test validate on blur mới đúng.
Từ v14, mọi API của user-event là async và cần await; nó cũng tự bọc trong act nên hạn chế được warning về state update. fireEvent vẫn hữu ích cho event không có tương tác tương ứng (scroll, error của img, custom event).