ಕನ್ನಡ

ಈ ಸಂಪೂರ್ಣ ಮಾರ್ಗದರ್ಶಿಯೊಂದಿಗೆ ರಿಯಾಕ್ಟ್ ಟೆಸ್ಟಿಂಗ್ ಲೈಬ್ರರಿ (RTL) ಯಲ್ಲಿ ಪರಿಣಿತಿ ಪಡೆಯಿರಿ. ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು ಮತ್ತು ನೈಜ-ಪ್ರಪಂಚದ ಉದಾಹರಣೆಗಳ ಮೇಲೆ ಕೇಂದ್ರೀಕರಿಸಿ, ನಿಮ್ಮ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಪರಿಣಾಮಕಾರಿ, ನಿರ್ವಹಿಸಬಲ್ಲ ಮತ್ತು ಬಳಕೆದಾರ-ಕೇಂದ್ರಿತ ಪರೀಕ್ಷೆಗಳನ್ನು ಬರೆಯುವುದು ಹೇಗೆಂದು ತಿಳಿಯಿರಿ.

ರಿಯಾಕ್ಟ್ ಟೆಸ್ಟಿಂಗ್ ಲೈಬ್ರರಿ: ಒಂದು ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ

ಇಂದಿನ ವೇಗದ ವೆಬ್ ಡೆವಲಪ್‌ಮೆಂಟ್ ಜಗತ್ತಿನಲ್ಲಿ, ನಿಮ್ಮ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಗುಣಮಟ್ಟ ಮತ್ತು ವಿಶ್ವಾಸಾರ್ಹತೆಯನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳುವುದು ಬಹಳ ಮುಖ್ಯ. ರಿಯಾಕ್ಟ್ ಟೆಸ್ಟಿಂಗ್ ಲೈಬ್ರರಿ (RTL) ಬಳಕೆದಾರರ ದೃಷ್ಟಿಕೋನವನ್ನು ಕೇಂದ್ರೀಕರಿಸುವ ಪರೀಕ್ಷೆಗಳನ್ನು ಬರೆಯಲು ಜನಪ್ರಿಯ ಮತ್ತು ಪರಿಣಾಮಕಾರಿ ಪರಿಹಾರವಾಗಿ ಹೊರಹೊಮ್ಮಿದೆ. ಈ ಮಾರ್ಗದರ್ಶಿಯು RTL ನ ಸಂಪೂರ್ಣ ಅವಲೋಕನವನ್ನು ಒದಗಿಸುತ್ತದೆ, ಮೂಲಭೂತ ಪರಿಕಲ್ಪನೆಗಳಿಂದ ಹಿಡಿದು ಸುಧಾರಿತ ತಂತ್ರಗಳವರೆಗೆ ಎಲ್ಲವನ್ನೂ ಒಳಗೊಂಡಿದೆ, ಇದು ನಿಮಗೆ ದೃಢವಾದ ಮತ್ತು ನಿರ್ವಹಿಸಬಲ್ಲ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಅಧಿಕಾರ ನೀಡುತ್ತದೆ.

ರಿಯಾಕ್ಟ್ ಟೆಸ್ಟಿಂಗ್ ಲೈಬ್ರರಿಯನ್ನು ಏಕೆ ಆರಿಸಬೇಕು?

ಸಾಂಪ್ರದಾಯಿಕ ಪರೀಕ್ಷಾ ವಿಧಾನಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಇಂಪ್ಲಿಮೆಂಟೇಶನ್ ವಿವರಗಳ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿರುತ್ತವೆ, ಇದರಿಂದಾಗಿ ಪರೀಕ್ಷೆಗಳು ದುರ್ಬಲವಾಗುತ್ತವೆ ಮತ್ತು ಸಣ್ಣ ಕೋಡ್ ಬದಲಾವಣೆಗಳೊಂದಿಗೆ ಮುರಿದುಹೋಗುವ ಸಾಧ್ಯತೆ ಇರುತ್ತದೆ. ಮತ್ತೊಂದೆಡೆ, RTL, ಬಳಕೆದಾರರು ತಮ್ಮೊಂದಿಗೆ ಹೇಗೆ ಸಂವಹನ ನಡೆಸುತ್ತಾರೆ ಎಂಬುದರ ಆಧಾರದ ಮೇಲೆ ನಿಮ್ಮ ಕಾಂಪೊನೆಂಟ್‌ಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಪ್ರೋತ್ಸಾಹಿಸುತ್ತದೆ, ಬಳಕೆದಾರರು ಏನು ನೋಡುತ್ತಾರೆ ಮತ್ತು ಅನುಭವಿಸುತ್ತಾರೆ ಎಂಬುದರ ಮೇಲೆ ಕೇಂದ್ರೀಕರಿಸುತ್ತದೆ. ಈ ವಿಧಾನವು ಹಲವಾರು ಪ್ರಮುಖ ಪ್ರಯೋಜನಗಳನ್ನು ನೀಡುತ್ತದೆ:

ನಿಮ್ಮ ಟೆಸ್ಟಿಂಗ್ ಪರಿಸರವನ್ನು ಸ್ಥಾಪಿಸುವುದು

ನೀವು RTL ಬಳಸಲು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು, ನಿಮ್ಮ ಟೆಸ್ಟಿಂಗ್ ಪರಿಸರವನ್ನು ನೀವು ಸ್ಥಾಪಿಸಬೇಕು. ಇದು ಸಾಮಾನ್ಯವಾಗಿ ಅಗತ್ಯವಾದ ಡಿಪೆಂಡೆನ್ಸಿಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡುವುದು ಮತ್ತು ನಿಮ್ಮ ಟೆಸ್ಟಿಂಗ್ ಫ್ರೇಮ್‌ವರ್ಕ್ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುವುದನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ.

ಪೂರ್ವಾಪೇಕ್ಷಿತಗಳು

ಇನ್‌ಸ್ಟಾಲೇಶನ್

npm ಅಥವಾ yarn ಬಳಸಿ ಕೆಳಗಿನ ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ:

npm install --save-dev @testing-library/react @testing-library/jest-dom jest babel-jest @babel/preset-env @babel/preset-react

ಅಥವಾ, yarn ಬಳಸಿ:

yarn add --dev @testing-library/react @testing-library/jest-dom jest babel-jest @babel/preset-env @babel/preset-react

ಪ್ಯಾಕೇಜ್‌ಗಳ ವಿವರಣೆ:

ಕಾನ್ಫಿಗರೇಶನ್

ನಿಮ್ಮ ಪ್ರಾಜೆಕ್ಟ್‌ನ ರೂಟ್‌ನಲ್ಲಿ `babel.config.js` ಫೈಲ್ ಅನ್ನು ಈ ಕೆಳಗಿನ ವಿಷಯದೊಂದಿಗೆ ರಚಿಸಿ:

module.exports = {
  presets: ['@babel/preset-env', '@babel/preset-react'],
};

ಟೆಸ್ಟ್ ಸ್ಕ್ರಿಪ್ಟ್ ಸೇರಿಸಲು ನಿಮ್ಮ `package.json` ಫೈಲ್ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಿ:

{
  "scripts": {
    "test": "jest"
  }
}

Jest ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ನಿಮ್ಮ ಪ್ರಾಜೆಕ್ಟ್‌ನ ರೂಟ್‌ನಲ್ಲಿ `jest.config.js` ಫೈಲ್ ಅನ್ನು ರಚಿಸಿ. ಕನಿಷ್ಠ ಕಾನ್ಫಿಗರೇಶನ್ ಈ ರೀತಿ ಇರಬಹುದು:

module.exports = {
  testEnvironment: 'jsdom',
  setupFilesAfterEnv: ['<rootDir>/src/setupTests.js'],
};

ಕೆಳಗಿನ ವಿಷಯದೊಂದಿಗೆ `src/setupTests.js` ಫೈಲ್ ಅನ್ನು ರಚಿಸಿ. ಇದು ನಿಮ್ಮ ಎಲ್ಲಾ ಪರೀಕ್ಷೆಗಳಲ್ಲಿ Jest DOM ಮ್ಯಾಚರ್‌ಗಳು ಲಭ್ಯವಿರುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ:

import '@testing-library/jest-dom/extend-expect';

ನಿಮ್ಮ ಮೊದಲ ಪರೀಕ್ಷೆಯನ್ನು ಬರೆಯುವುದು

ಒಂದು ಸರಳ ಉದಾಹರಣೆಯೊಂದಿಗೆ ಪ್ರಾರಂಭಿಸೋಣ. ನೀವು ಶುಭಾಶಯ ಸಂದೇಶವನ್ನು ಪ್ರದರ್ಶಿಸುವ ರಿಯಾಕ್ಟ್ ಕಾಂಪೊನೆಂಟ್ ಹೊಂದಿದ್ದೀರಿ ಎಂದು ಭಾವಿಸೋಣ:

// src/components/Greeting.js
import React from 'react';

function Greeting({ name }) {
  return <h1>Hello, {name}!</h1>;
}

export default Greeting;

ಈಗ, ಈ ಕಾಂಪೊನೆಂಟ್‌ಗೆ ಒಂದು ಪರೀಕ್ಷೆಯನ್ನು ಬರೆಯೋಣ:

// src/components/Greeting.test.js
import React from 'react';
import { render, screen } from '@testing-library/react';
import Greeting from './Greeting';

test('renders a greeting message', () => {
  render(<Greeting name="World" />);
  const greetingElement = screen.getByText(/Hello, World!/i);
  expect(greetingElement).toBeInTheDocument();
});

ವಿವರಣೆ:

ಪರೀಕ್ಷೆಯನ್ನು ಚಲಾಯಿಸಲು, ನಿಮ್ಮ ಟರ್ಮಿನಲ್‌ನಲ್ಲಿ ಈ ಕೆಳಗಿನ ಕಮಾಂಡ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಿ:

npm test

ಎಲ್ಲವೂ ಸರಿಯಾಗಿ ಕಾನ್ಫಿಗರ್ ಆಗಿದ್ದರೆ, ಪರೀಕ್ಷೆಯು ಪಾಸ್ ಆಗಬೇಕು.

ಸಾಮಾನ್ಯ RTL ಕ್ವೆರಿಗಳು

RTL DOM ನಲ್ಲಿ ಎಲಿಮೆಂಟ್‌ಗಳನ್ನು ಹುಡುಕಲು ವಿವಿಧ ಕ್ವೆರಿ ವಿಧಾನಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ. ಈ ಕ್ವೆರಿಗಳನ್ನು ಬಳಕೆದಾರರು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ನೊಂದಿಗೆ ಹೇಗೆ ಸಂವಹನ ನಡೆಸುತ್ತಾರೆ ಎಂಬುದನ್ನು ಅನುಕರಿಸಲು ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ.

`getByRole`

ಈ ಕ್ವೆರಿಯು ಅದರ ARIA ರೋಲ್ ಮೂಲಕ ಎಲಿಮೆಂಟ್ ಅನ್ನು ಹುಡುಕುತ್ತದೆ. ಸಾಧ್ಯವಾದಾಗಲೆಲ್ಲಾ `getByRole` ಬಳಸುವುದು ಉತ್ತಮ ಅಭ್ಯಾಸವಾಗಿದೆ, ಏಕೆಂದರೆ ಇದು ಪ್ರವೇಶಸಾಧ್ಯತೆಯನ್ನು ಉತ್ತೇಜಿಸುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಪರೀಕ್ಷೆಗಳು ಆಧಾರವಾಗಿರುವ DOM ರಚನೆಯ ಬದಲಾವಣೆಗಳಿಗೆ ಸ್ಥಿತಿಸ್ಥಾಪಕವಾಗಿರುವುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.

<button role="button">Click me</button>
const buttonElement = screen.getByRole('button');
expect(buttonElement).toBeInTheDocument();

`getByLabelText`

ಈ ಕ್ವೆರಿಯು ಸಂಬಂಧಿತ ಲೇಬಲ್‌ನ ಟೆಕ್ಸ್ಟ್ ಮೂಲಕ ಎಲಿಮೆಂಟ್ ಅನ್ನು ಹುಡುಕುತ್ತದೆ. ಫಾರ್ಮ್ ಎಲಿಮೆಂಟ್‌ಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಇದು ಉಪಯುಕ್ತವಾಗಿದೆ.

<label htmlFor="name">Name:</label>
<input type="text" id="name" />
const nameInputElement = screen.getByLabelText('Name:');
expect(nameInputElement).toBeInTheDocument();

`getByPlaceholderText`

ಈ ಕ್ವೆರಿಯು ಅದರ ಪ್ಲೇಸ್‌ಹೋಲ್ಡರ್ ಟೆಕ್ಸ್ಟ್ ಮೂಲಕ ಎಲಿಮೆಂಟ್ ಅನ್ನು ಹುಡುಕುತ್ತದೆ.

<input type="text" placeholder="Enter your email" />
const emailInputElement = screen.getByPlaceholderText('Enter your email');
expect(emailInputElement).toBeInTheDocument();

`getByAltText`

ಈ ಕ್ವೆರಿಯು ಇಮೇಜ್ ಎಲಿಮೆಂಟ್ ಅನ್ನು ಅದರ ಆಲ್ಟ್ ಟೆಕ್ಸ್ಟ್ ಮೂಲಕ ಹುಡುಕುತ್ತದೆ. ಪ್ರವೇಶಸಾಧ್ಯತೆಯನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಎಲ್ಲಾ ಇಮೇಜ್‌ಗಳಿಗೆ ಅರ್ಥಪೂರ್ಣವಾದ ಆಲ್ಟ್ ಟೆಕ್ಸ್ಟ್ ಒದಗಿಸುವುದು ಮುಖ್ಯವಾಗಿದೆ.

<img src="logo.png" alt="Company Logo" />
const logoImageElement = screen.getByAltText('Company Logo');
expect(logoImageElement).toBeInTheDocument();

`getByTitle`

ಈ ಕ್ವೆರಿಯು ಎಲಿಮೆಂಟ್ ಅನ್ನು ಅದರ ಟೈಟಲ್ ಆಟ್ರಿಬ್ಯೂಟ್ ಮೂಲಕ ಹುಡುಕುತ್ತದೆ.

<span title="Close">X</span>
const closeElement = screen.getByTitle('Close');
expect(closeElement).toBeInTheDocument();

`getByDisplayValue`

ಈ ಕ್ವೆರಿಯು ಎಲಿಮೆಂಟ್ ಅನ್ನು ಅದರ ಡಿಸ್‌ಪ್ಲೇ ವ್ಯಾಲ್ಯೂ ಮೂಲಕ ಹುಡುಕುತ್ತದೆ. ಪೂರ್ವ-ಭರ್ತಿ ಮಾಡಿದ ಮೌಲ್ಯಗಳೊಂದಿಗೆ ಫಾರ್ಮ್ ಇನ್‌ಪುಟ್‌ಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಇದು ಉಪಯುಕ್ತವಾಗಿದೆ.

<input type="text" value="Initial Value" />
const inputElement = screen.getByDisplayValue('Initial Value');
expect(inputElement).toBeInTheDocument();

`getAllBy*` ಕ್ವೆರಿಗಳು

`getBy*` ಕ್ವೆರಿಗಳ ಜೊತೆಗೆ, RTL `getAllBy*` ಕ್ವೆರಿಗಳನ್ನು ಸಹ ಒದಗಿಸುತ್ತದೆ, ಇದು ಹೊಂದಾಣಿಕೆಯಾಗುವ ಎಲಿಮೆಂಟ್‌ಗಳ ಅರೇಯನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಒಂದೇ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಹೊಂದಿರುವ ಅನೇಕ ಎಲಿಮೆಂಟ್‌ಗಳು DOM ನಲ್ಲಿ ಇವೆಯೇ ಎಂದು ನೀವು ಅಸರ್ಟ್ ಮಾಡಬೇಕಾದಾಗ ಇವು ಉಪಯುಕ್ತವಾಗಿವೆ.

<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
const listItems = screen.getAllByRole('listitem');
expect(listItems).toHaveLength(3);

`queryBy*` ಕ್ವೆರಿಗಳು

`queryBy*` ಕ್ವೆರಿಗಳು `getBy*` ಕ್ವೆರಿಗಳಿಗೆ ಹೋಲುತ್ತವೆ, ಆದರೆ ಹೊಂದಾಣಿಕೆಯಾಗುವ ಎಲಿಮೆಂಟ್ ಕಂಡುಬರದಿದ್ದರೆ, ದೋಷವನ್ನು ಎಸೆಯುವ ಬದಲು `null` ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತವೆ. DOM ನಲ್ಲಿ ಒಂದು ಎಲಿಮೆಂಟ್ ಇಲ್ಲ ಎಂದು ನೀವು ಅಸರ್ಟ್ ಮಾಡಲು ಬಯಸಿದಾಗ ಇದು ಉಪಯುಕ್ತವಾಗಿದೆ.

const missingElement = screen.queryByText('Non-existent text');
expect(missingElement).toBeNull();

`findBy*` ಕ್ವೆರಿಗಳು

`findBy*` ಕ್ವೆರಿಗಳು `getBy*` ಕ್ವೆರಿಗಳ ಅಸಿಂಕ್ರೋನಸ್ ಆವೃತ್ತಿಗಳಾಗಿವೆ. ಹೊಂದಾಣಿಕೆಯಾಗುವ ಎಲಿಮೆಂಟ್ ಕಂಡುಬಂದಾಗ ರಿಸಾಲ್ವ್ ಆಗುವ ಪ್ರಾಮಿಸ್ ಅನ್ನು ಅವು ಹಿಂತಿರುಗಿಸುತ್ತವೆ. API ನಿಂದ ಡೇಟಾವನ್ನು ಪಡೆಯುವಂತಹ ಅಸಿಂಕ್ರೋನಸ್ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಇವು ಉಪಯುಕ್ತವಾಗಿವೆ.

// Simulating an asynchronous data fetch
const fetchData = () => new Promise(resolve => {
  setTimeout(() => resolve('Data Loaded!'), 1000);
});

function MyComponent() {
  const [data, setData] = React.useState(null);

  React.useEffect(() => {
    fetchData().then(setData);
  }, []);

  return <div>{data}</div>;
}
test('loads data asynchronously', async () => {
  render(<MyComponent />);
  const dataElement = await screen.findByText('Data Loaded!');
  expect(dataElement).toBeInTheDocument();
});

ಬಳಕೆದಾರರ ಸಂವಹನಗಳನ್ನು ಅನುಕರಿಸುವುದು

RTL ಬಳಕೆದಾರರ ಸಂವಹನಗಳನ್ನು ಅನುಕರಿಸಲು `fireEvent` ಮತ್ತು `userEvent` API ಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ, ಉದಾಹರಣೆಗೆ ಬಟನ್‌ಗಳನ್ನು ಕ್ಲಿಕ್ ಮಾಡುವುದು, ಇನ್‌ಪುಟ್ ಫೀಲ್ಡ್‌ಗಳಲ್ಲಿ ಟೈಪ್ ಮಾಡುವುದು ಮತ್ತು ಫಾರ್ಮ್‌ಗಳನ್ನು ಸಲ್ಲಿಸುವುದು.

`fireEvent`

`fireEvent` ನಿಮಗೆ ಪ್ರೋಗ್ರಾಮ್ಯಾಟಿಕ್ ಆಗಿ DOM ಈವೆಂಟ್‌ಗಳನ್ನು ಪ್ರಚೋದಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಕೆಳಮಟ್ಟದ API ಆಗಿದ್ದು, ಫೈರ್ ಆಗುವ ಈವೆಂಟ್‌ಗಳ ಮೇಲೆ ನಿಮಗೆ ಸೂಕ್ಷ್ಮ ನಿಯಂತ್ರಣವನ್ನು ನೀಡುತ್ತದೆ.

<button onClick={() => alert('Button clicked!')}>Click me</button>
import { fireEvent } from '@testing-library/react';

test('simulates a button click', () => {
  const alertMock = jest.spyOn(window, 'alert').mockImplementation(() => {});
  render(<button onClick={() => alert('Button clicked!')}>Click me</button>);
  const buttonElement = screen.getByRole('button');
  fireEvent.click(buttonElement);
  expect(alertMock).toHaveBeenCalledTimes(1);
  alertMock.mockRestore();
});

`userEvent`

`userEvent` ಒಂದು ಉನ್ನತ ಮಟ್ಟದ API ಆಗಿದ್ದು, ಇದು ಬಳಕೆದಾರರ ಸಂವಹನಗಳನ್ನು ಹೆಚ್ಚು ನೈಜವಾಗಿ ಅನುಕರಿಸುತ್ತದೆ. ಇದು ಫೋಕಸ್ ನಿರ್ವಹಣೆ ಮತ್ತು ಈವೆಂಟ್ ಆರ್ಡರಿಂಗ್‌ನಂತಹ ವಿವರಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ, ನಿಮ್ಮ ಪರೀಕ್ಷೆಗಳನ್ನು ಹೆಚ್ಚು ದೃಢವಾಗಿ ಮತ್ತು ಕಡಿಮೆ ದುರ್ಬಲವಾಗಿ ಮಾಡುತ್ತದೆ.

<input type="text" onChange={e => console.log(e.target.value)} />
import userEvent from '@testing-library/user-event';

test('simulates typing in an input field', () => {
  const inputElement = screen.getByRole('textbox');
  userEvent.type(inputElement, 'Hello, world!');
  expect(inputElement).toHaveValue('Hello, world!');
});

ಅಸಿಂಕ್ರೋನಸ್ ಕೋಡ್ ಅನ್ನು ಪರೀಕ್ಷಿಸುವುದು

ಅನೇಕ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಅಸಿಂಕ್ರೋನಸ್ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತವೆ, ಉದಾಹರಣೆಗೆ API ನಿಂದ ಡೇಟಾವನ್ನು ಪಡೆಯುವುದು. RTL ಅಸಿಂಕ್ರೋನಸ್ ಕೋಡ್ ಅನ್ನು ಪರೀಕ್ಷಿಸಲು ಹಲವಾರು ಉಪಕರಣಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ.

`waitFor`

`waitFor` ನಿಮಗೆ ಅಸರ್ಷನ್ ಮಾಡುವ ಮೊದಲು ಒಂದು ಸ್ಥಿತಿಯು ಸತ್ಯವಾಗುವವರೆಗೆ ಕಾಯಲು ಅನುಮತಿಸುತ್ತದೆ. ಪೂರ್ಣಗೊಳ್ಳಲು ಸ್ವಲ್ಪ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುವ ಅಸಿಂಕ್ರೋನಸ್ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಇದು ಉಪಯುಕ್ತವಾಗಿದೆ.

function MyComponent() {
  const [data, setData] = React.useState(null);

  React.useEffect(() => {
    setTimeout(() => {
      setData('Data loaded!');
    }, 1000);
  }, []);

  return <div>{data}</div>;
}
import { waitFor } from '@testing-library/react';

test('waits for data to load', async () => {
  render(<MyComponent />);
  await waitFor(() => screen.getByText('Data loaded!'));
  const dataElement = screen.getByText('Data loaded!');
  expect(dataElement).toBeInTheDocument();
});

`findBy*` ಕ್ವೆರಿಗಳು

ಮೊದಲೇ ಹೇಳಿದಂತೆ, `findBy*` ಕ್ವೆರಿಗಳು ಅಸಿಂಕ್ರೋನಸ್ ಆಗಿರುತ್ತವೆ ಮತ್ತು ಹೊಂದಾಣಿಕೆಯಾಗುವ ಎಲಿಮೆಂಟ್ ಕಂಡುಬಂದಾಗ ರಿಸಾಲ್ವ್ ಆಗುವ ಪ್ರಾಮಿಸ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತವೆ. DOM ನಲ್ಲಿ ಬದಲಾವಣೆಗಳಿಗೆ ಕಾರಣವಾಗುವ ಅಸಿಂಕ್ರೋನಸ್ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಇವು ಉಪಯುಕ್ತವಾಗಿವೆ.

ಹೂಕ್ಸ್ ಅನ್ನು ಪರೀಕ್ಷಿಸುವುದು

ರಿಯಾಕ್ಟ್ ಹೂಕ್ಸ್ ಸ್ಟೇಟ್‌ಫುಲ್ ಲಾಜಿಕ್ ಅನ್ನು ಒಳಗೊಂಡಿರುವ ಮರುಬಳಕೆ ಮಾಡಬಹುದಾದ ಫಂಕ್ಷನ್‌ಗಳಾಗಿವೆ. RTL ಕಸ್ಟಮ್ ಹೂಕ್ಸ್ ಅನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ಪರೀಕ್ಷಿಸಲು `@testing-library/react-hooks` ನಿಂದ (v17 ರಂತೆ ನೇರವಾಗಿ `@testing-library/react` ಪರವಾಗಿ ಡಿಪ್ರಿಕೇಟ್ ಮಾಡಲಾಗಿದೆ) `renderHook` ಯುಟಿಲಿಟಿಯನ್ನು ಒದಗಿಸುತ್ತದೆ.

// src/hooks/useCounter.js
import { useState } from 'react';

function useCounter(initialValue = 0) {
  const [count, setCount] = useState(initialValue);

  const increment = () => {
    setCount(prevCount => prevCount + 1);
  };

  const decrement = () => {
    setCount(prevCount => prevCount - 1);
  };

  return { count, increment, decrement };
}

export default useCounter;
// src/hooks/useCounter.test.js
import { renderHook, act } from '@testing-library/react';
import useCounter from './useCounter';

test('increments the counter', () => {
  const { result } = renderHook(() => useCounter());

  act(() => {
    result.current.increment();
  });

  expect(result.current.count).toBe(1);
});

ವಿವರಣೆ:

ಸುಧಾರಿತ ಪರೀಕ್ಷಾ ತಂತ್ರಗಳು

ಒಮ್ಮೆ ನೀವು RTL ನ ಮೂಲಭೂತ ಅಂಶಗಳನ್ನು ಕರಗತ ಮಾಡಿಕೊಂಡ ನಂತರ, ನಿಮ್ಮ ಪರೀಕ್ಷೆಗಳ ಗುಣಮಟ್ಟ ಮತ್ತು ನಿರ್ವಹಣೆಯನ್ನು ಸುಧಾರಿಸಲು ನೀವು ಹೆಚ್ಚು ಸುಧಾರಿತ ಪರೀಕ್ಷಾ ತಂತ್ರಗಳನ್ನು ಅನ್ವೇಷಿಸಬಹುದು.

ಮಾಕಿಂಗ್ ಮಾಡ್ಯೂಲ್‌ಗಳು

ಕೆಲವೊಮ್ಮೆ, ನಿಮ್ಮ ಕಾಂಪೊನೆಂಟ್‌ಗಳನ್ನು ಪ್ರತ್ಯೇಕಿಸಲು ಮತ್ತು ಪರೀಕ್ಷೆಯ ಸಮಯದಲ್ಲಿ ಅವುಗಳ ವರ್ತನೆಯನ್ನು ನಿಯಂತ್ರಿಸಲು ನೀವು ಬಾಹ್ಯ ಮಾಡ್ಯೂಲ್‌ಗಳು ಅಥವಾ ಡಿಪೆಂಡೆನ್ಸಿಗಳನ್ನು ಮಾಕ್ ಮಾಡಬೇಕಾಗಬಹುದು. Jest ಈ ಉದ್ದೇಶಕ್ಕಾಗಿ ಶಕ್ತಿಯುತ ಮಾಕಿಂಗ್ API ಅನ್ನು ಒದಗಿಸುತ್ತದೆ.

// src/api/dataService.js
export const fetchData = async () => {
  const response = await fetch('/api/data');
  const data = await response.json();
  return data;
};
// src/components/MyComponent.js
import React, { useState, useEffect } from 'react';
import { fetchData } from '../api/dataService';

function MyComponent() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetchData().then(setData);
  }, []);

  return <div>{data}</div>;
}
// src/components/MyComponent.test.js
import { render, screen, waitFor } from '@testing-library/react';
import MyComponent from './MyComponent';
import * as dataService from '../api/dataService';

jest.mock('../api/dataService');

test('fetches data from the API', async () => {
  dataService.fetchData.mockResolvedValue({ message: 'Mocked data!' });

  render(<MyComponent />);

  await waitFor(() => screen.getByText('Mocked data!'));

  expect(screen.getByText('Mocked data!')).toBeInTheDocument();
  expect(dataService.fetchData).toHaveBeenCalledTimes(1);
});

ವಿವರಣೆ:

ಕಾಂಟೆಕ್ಸ್ಟ್ ಪ್ರೊವೈಡರ್‌ಗಳು

ನಿಮ್ಮ ಕಾಂಪೊನೆಂಟ್ ಕಾಂಟೆಕ್ಸ್ಟ್ ಪ್ರೊವೈಡರ್ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿದ್ದರೆ, ಪರೀಕ್ಷೆಯ ಸಮಯದಲ್ಲಿ ನಿಮ್ಮ ಕಾಂಪೊನೆಂಟ್ ಅನ್ನು ಪ್ರೊವೈಡರ್‌ನಲ್ಲಿ ಸುತ್ತುವರಿಯಬೇಕಾಗುತ್ತದೆ. ಇದು ಕಾಂಪೊನೆಂಟ್‌ಗೆ ಕಾಂಟೆಕ್ಸ್ಟ್ ಮೌಲ್ಯಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.

// src/contexts/ThemeContext.js
import React, { createContext, useState } from 'react';

export const ThemeContext = createContext();

export function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light');

  const toggleTheme = () => {
    setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light'));
  };

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}
// src/components/MyComponent.js
import React, { useContext } from 'react';
import { ThemeContext } from '../contexts/ThemeContext';

function MyComponent() {
  const { theme, toggleTheme } = useContext(ThemeContext);

  return (
    <div style={{ backgroundColor: theme === 'light' ? '#fff' : '#000', color: theme === 'light' ? '#000' : '#fff' }}>
      <p>Current theme: {theme}</p>
      <button onClick={toggleTheme}>Toggle Theme</button>
    </div>
  );
}
// src/components/MyComponent.test.js
import { render, screen, fireEvent } from '@testing-library/react';
import MyComponent from './MyComponent';
import { ThemeProvider } from '../contexts/ThemeContext';

test('toggles the theme', () => {
  render(
    <ThemeProvider>
      <MyComponent />
    </ThemeProvider>
  );

  const themeParagraph = screen.getByText(/Current theme: light/i);
  const toggleButton = screen.getByRole('button', { name: /Toggle Theme/i });

  expect(themeParagraph).toBeInTheDocument();

  fireEvent.click(toggleButton);

  expect(screen.getByText(/Current theme: dark/i)).toBeInTheDocument();
});

ವಿವರಣೆ:

ರೌಟರ್‌ನೊಂದಿಗೆ ಪರೀಕ್ಷಿಸುವುದು

ರಿಯಾಕ್ಟ್ ರೌಟರ್ ಬಳಸುವ ಕಾಂಪೊನೆಂಟ್‌ಗಳನ್ನು ಪರೀಕ್ಷಿಸುವಾಗ, ನೀವು ಮಾಕ್ ರೌಟರ್ ಕಾಂಟೆಕ್ಸ್ಟ್ ಅನ್ನು ಒದಗಿಸಬೇಕಾಗುತ್ತದೆ. ನೀವು ಇದನ್ನು `react-router-dom` ನಿಂದ `MemoryRouter` ಕಾಂಪೊನೆಂಟ್ ಬಳಸಿ ಸಾಧಿಸಬಹುದು.

// src/components/MyComponent.js
import React from 'react';
import { Link } from 'react-router-dom';

function MyComponent() {
  return (
    <div>
      <Link to="/about">Go to About Page</Link>
    </div>
  );
}
// src/components/MyComponent.test.js
import { render, screen } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import MyComponent from './MyComponent';

test('renders a link to the about page', () => {
  render(
    <MemoryRouter>
      <MyComponent />
    </MemoryRouter>
  );

  const linkElement = screen.getByRole('link', { name: /Go to About Page/i });
  expect(linkElement).toBeInTheDocument();
  expect(linkElement).toHaveAttribute('href', '/about');
});

ವಿವರಣೆ:

ಪರಿಣಾಮಕಾರಿ ಪರೀಕ್ಷೆಗಳನ್ನು ಬರೆಯಲು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು

RTL ನೊಂದಿಗೆ ಪರೀಕ್ಷೆಗಳನ್ನು ಬರೆಯುವಾಗ ಅನುಸರಿಸಬೇಕಾದ ಕೆಲವು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು ಇಲ್ಲಿವೆ:

ತೀರ್ಮಾನ

ರಿಯಾಕ್ಟ್ ಟೆಸ್ಟಿಂಗ್ ಲೈಬ್ರರಿಯು ನಿಮ್ಮ ರಿಯಾಕ್ಟ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಪರಿಣಾಮಕಾರಿ, ನಿರ್ವಹಿಸಬಲ್ಲ ಮತ್ತು ಬಳಕೆದಾರ-ಕೇಂದ್ರಿತ ಪರೀಕ್ಷೆಗಳನ್ನು ಬರೆಯಲು ಒಂದು ಶಕ್ತಿಯುತ ಸಾಧನವಾಗಿದೆ. ಈ ಮಾರ್ಗದರ್ಶಿಯಲ್ಲಿ ವಿವರಿಸಲಾದ ತತ್ವಗಳು ಮತ್ತು ತಂತ್ರಗಳನ್ನು ಅನುಸರಿಸುವ ಮೂಲಕ, ನೀವು ನಿಮ್ಮ ಬಳಕೆದಾರರ ಅಗತ್ಯಗಳನ್ನು ಪೂರೈಸುವ ದೃಢವಾದ ಮತ್ತು ವಿಶ್ವಾಸಾರ್ಹ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಬಹುದು. ಬಳಕೆದಾರರ ದೃಷ್ಟಿಕೋನದಿಂದ ಪರೀಕ್ಷಿಸುವುದರ ಮೇಲೆ ಗಮನಹರಿಸಲು, ಇಂಪ್ಲಿಮೆಂಟೇಶನ್ ವಿವರಗಳನ್ನು ಪರೀಕ್ಷಿಸುವುದನ್ನು ತಪ್ಪಿಸಲು, ಮತ್ತು ಸ್ಪಷ್ಟ ಮತ್ತು ಸಂಕ್ಷಿಪ್ತ ಪರೀಕ್ಷೆಗಳನ್ನು ಬರೆಯಲು ಮರೆಯದಿರಿ. RTL ಅನ್ನು ಅಳವಡಿಸಿಕೊಳ್ಳುವ ಮೂಲಕ ಮತ್ತು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳನ್ನು ಅನುಸರಿಸುವ ಮೂಲಕ, ನಿಮ್ಮ ಸ್ಥಳ ಅಥವಾ ನಿಮ್ಮ ಜಾಗತಿಕ ಪ್ರೇಕ್ಷಕರ ನಿರ್ದಿಷ್ಟ ಅವಶ್ಯಕತೆಗಳನ್ನು ಲೆಕ್ಕಿಸದೆ ನಿಮ್ಮ ರಿಯಾಕ್ಟ್ ಪ್ರಾಜೆಕ್ಟ್‌ಗಳ ಗುಣಮಟ್ಟ ಮತ್ತು ನಿರ್ವಹಣೆಯನ್ನು ನೀವು ಗಮನಾರ್ಹವಾಗಿ ಸುಧಾರಿಸಬಹುದು.