React Testing Library: Jak sprawdzić kolejność wyświetlanych elementów na liście?
Opublikowano: 17.10.2023 - tagi: JavaScript React Testowanie Test Lista
Jaka kolejność na liście?
Można to sprawdzić na kilka sposobów.
Najpierw kod przykładowej aplikacji:
import { useState } from "react";
export function MyComponent() {
const [tasks, setTasks] = useState(['Task 1', 'Task 2', 'Task 3']);
const [task, setTask] = useState('');
const onChangeTask = (e) => {
setTask(e.target.value)
};
const onAddTask = (e) => {
e.preventDefault();
setTasks([task, ...tasks]);
setTask('');
}
return (
<>
<form onSubmit={onAddTask}>
<label htmlFor="newTask">Task title:</label>
<input type="text" id="newTask" value={task} onChange={onChangeTask} />
<button>Add</button>
</form>
<ul>
{
tasks.map((task, index) => (
<li key={index}>
{task}
</li>
))
}
</ul>
</>
)
}
Przykłady
Sposób 1: toMatchInlineSnapshot
Jest udostępnia funkcję toMatchInlineSnapshot testowania struktury DOM.
import { render, screen } from '@testing-library/react';
import { MyComponent} from "./MyComponent";
test('should check order of list items', async () => {
// given
const { getByRole } = screen;
render(<MyComponent />);
// when
const list = getByRole('list');
// then
expect(list).toMatchInlineSnapshot(`
<ul>
<li>
Task 1
</li>
<li>
Task 2
</li>
<li>
Task 3
</li>
</ul>
`)
});
Jeśli element listy jest dość rozbudowany takie testowanie może być uciążliwe. Ale można to obejść w prosty sposób!
Wywołaj najpierw test z toMatchInlineSnapshot bez żadnych argumentów:
expect(list).toMatchInlineSnapshot();
po chwili zostanie dodany argument do toMatchInlineSnapshot z listą elementów.
Sposób 2: Tablica elementów
Możesz też pobrać nazwy elementów i umieścić je w tablicy:
import { render, screen } from '@testing-library/react';
import { MyComponent} from "./MyComponent";
test('should check order of list items', async () => {
// given
const { getAllByRole } = screen;
render(<MyComponent />);
// when
const listItems = getAllByRole('listitem').map((item) => item.textContent);
// then
expect(listItems).toEqual(['Task 1', 'Task 2', 'Task 3']);
});