#reactjs #jestjs #ts-jest #babel-jest
Вопрос:
Я провожу тест компонента в react (мой первый) и хочу проверить число, когда я передаю ему значение, оно возвращается неопределенным, и я удаляю значение, чтобы посмотреть, что оно вернуло, и все было в порядке, найдите элемент
import React, { useState } from 'react';
import { render, cleanup, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { NumberUpDown } from '../../components/number-
updown/NumberUpDown';
import '@testing-library/jest-dom/extend-expect'
const UpDownNumber = () => {
const [quantity, setQuantity] = useState<number>(1);
const packageType = 'box'
return (
<NumberUpDown
value={quantity}
valueToShow={
packageType === 'box' || 'pack' || 'piece' || 'bag' || 'sbox'
? quantity : quantity * 12
}
min={1}
max={5000}
step={1}
onChange={value => setQuantity(value)}
/>
);
};
describe('Plus or minus in the product modal', () => {
afterEach(cleanup);
beforeEach(() => render(<UpDownNumber />));
it('Validate is if exists', () => {
expect(screen.getByTestId('product-minus')).toBeInTheDocument();
expect(screen.getByTestId('product-input')).toBeInTheDocument();
expect(screen.getByTestId('product-plus')).toBeInTheDocument();
});
it('Validate function onclick', () => {
const minusButton = screen.getByTestId('product-minus');
const plusButton = screen.getByTestId('product-plus');
const input = screen.getByTestId('product-input');
userEvent.click(plusButton);
userEvent.click(plusButton);
expect(getByRole('textbox', { name: /email/i })).toHaveValue('test@email.com);
expect((input as HTMLInputElement).value).toBe(3);
userEvent.click(minusButton);
expect((input as HTMLInputElement)).toBe(2);
});
});
Expected: 3
Received: <ion-input class="value-cell" data-testid="product-input" type="number"
value="3" />
expect((input as HTMLInputElement).value).toBe(3);
Expected: 3
Received: undefined
Мне нужно, чтобы при доступе к тегу, когда он его найдет, получить значение…
Ответ №1:
Вы уже используете @testing-библиотеку, поэтому я предлагаю сделать еще один шаг вперед и добавить https://www.npmjs.com/package/@testing-library/jest-dom как зависимость от девайса. Если вы используете приложение на основе приложения Create React, вы можете добавить в свой setupTests.js
файл импорт, например
import '@testing-library/jest-dom/extend-expect';
Затем вы можете написать тесты для проверки значения поля, используя что-то вроде:
expect(getByRole('textbox', { name: /email/i })).toHaveValue('test@email.com);
Использование jest-dom
позволяет вам писать тесты, которые читаются намного лучше, но это только мое мнение.
Комментарии:
1. Я только что сделал обновление, со всем кодом тестового компонента
2. Извините, мне кажется, я не очень хорошо объяснился. Похоже, вы просто скопировали/вставили мою тестовую строку, но вам нужно будет изменить ее для ваших целей, так что, возможно, что-то вроде
expect(screen.getByTestId('product-input')).toHaveValue(3);
. Я предполагаю, что нажатие кнопки «Плюс» увеличивает значение элемента ввода. Однако, если это возможно, лучше использоватьgetByRole
повторноgetByTestId
.@testing-library
делает действительно хорошую работу по отображению найденных ролей, если он может найти указанную.3. ожидайте(элемент). toHaveValue(3) Ожидал, что элемент будет иметь значение: 3 Получено: не определено
4. Та же проблема :/ 🙁
5. У вас есть код, к которому у меня нет доступа, если возможно, вы могли бы создать песочницу со всем вашим кодом, чтобы его можно было запустить и отправить обратно URL-адрес здесь. Возможно, это поможет вам легче разобраться в вашей проблеме.