React Testing Libraryã§Reactã³ã³ããŒãã³ãã®ãã¹ãããã¹ã¿ãŒããŸãããããŠãŒã¶ãŒã®è¡åãšã¢ã¯ã»ã·ããªãã£ã«çŠç¹ãåœãŠããä¿å®ãããã广çãªãã¹ããäœæããããã®ãã¹ããã©ã¯ãã£ã¹ãåŠã³ãŸãã
React Testing Library: ã°ããŒãã«ããŒã ã®ããã®ã³ã³ããŒãã³ããã¹ãã®ãã¹ããã©ã¯ãã£ã¹
ãŠã§ãéçºã®äžçãçµ¶ãéãªãé²åããäžã§ãReactã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ãšå質ã確ä¿ããããšã¯æãéèŠã§ããããã¯ã倿§ãªãŠãŒã¶ãŒããŒã¹ãšã¢ã¯ã»ã·ããªãã£èŠä»¶ãæã€ãããžã§ã¯ãã«åãçµãã°ããŒãã«ããŒã ã«ãšã£ãŠã¯ç¹ã«åœãŠã¯ãŸããŸããReact Testing LibraryïŒRTLïŒã¯ãã³ã³ããŒãã³ããã¹ãã«å¯Ÿãã匷åã§ãŠãŒã¶ãŒäžå¿ã®ã¢ãããŒããæäŸããŸããå®è£ ã®è©³çްã«çŠç¹ãåœãŠãåŸæ¥ã®ãã¹ãæ¹æ³ãšã¯ç°ãªããRTLã¯ãŠãŒã¶ãŒãã³ã³ããŒãã³ããæäœããã®ãšåãããã«ãã¹ãããããšãæšå¥šããããå ç¢ã§ä¿å®ãããããã¹ãã«ã€ãªãããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«é©ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããšã«çŠç¹ãåœãŠãŠãReactãããžã§ã¯ãã§RTLãæŽ»çšããããã®ãã¹ããã©ã¯ãã£ã¹ã詳ãã説æããŸãã
React Testing Libraryãéžã¶çç±
ãã¹ããã©ã¯ãã£ã¹ã«å ¥ãåã«ãRTLãä»ã®ãã¹ãã©ã€ãã©ãªãããåªããŠããçç±ãçè§£ããããšãéèŠã§ããäž»ãªå©ç¹ãããã€ãã玹ä»ããŸãã
- ãŠãŒã¶ãŒäžå¿ã®ã¢ãããŒã: RTLã¯ããŠãŒã¶ãŒã®èŠç¹ããã³ã³ããŒãã³ãããã¹ãããããšãåªå ããŸãããŠãŒã¶ãŒãšåãæ¹æ³ïŒãã¿ã³ãã¯ãªãã¯ããããå ¥åãã£ãŒã«ãã«å ¥åããããããªã©ïŒã§ã³ã³ããŒãã³ããæäœããããçŸå®çã§ä¿¡é Œæ§ã®é«ããã¹ããšã¯ã¹ããªãšã³ã¹ãä¿èšŒããŸãã
- ã¢ã¯ã»ã·ããªãã£éèŠ: RTLã¯ãé害ãæã€ãŠãŒã¶ãŒãèæ ®ããæ¹æ³ã§ã³ã³ããŒãã³ãããã¹ãããããšãæšå¥šããããšã«ãããã¢ã¯ã»ã·ãã«ãªã³ã³ããŒãã³ãã®äœæãä¿é²ããŸããããã¯ãWCAGãªã©ã®ã°ããŒãã«ãªã¢ã¯ã»ã·ããªãã£æšæºã«æ²¿ã£ãŠããŸãã
- ã¡ã³ããã³ã¹ã®åæž: ïŒå éšç¶æ ãç¹å®ã®é¢æ°åŒã³åºããªã©ã®ïŒå®è£ ã®è©³çްããã¹ãããããšãé¿ããããšã§ãã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ãããšãã«RTLãã¹ããå£ããå¯èœæ§ãäœããªããŸããããã«ãããããä¿å®ãããããå埩åã®ãããã¹ããå®çŸããŸãã
- æ¹åãããã³ãŒãèšèš: RTLã®ãŠãŒã¶ãŒäžå¿ã®ã¢ãããŒãã¯ããŠãŒã¶ãŒãã³ã³ããŒãã³ããã©ã®ããã«æäœããããèããããšã匷å¶ãããããããåªããã³ã³ããŒãã³ãèšèšã«ã€ãªããããšããããããŸãã
- ã³ãã¥ããã£ãšãšã³ã·ã¹ãã : RTLã¯ãå€§èŠæš¡ã§æŽ»çºãªã³ãã¥ããã£ãèªããè±å¯ãªãªãœãŒã¹ããµããŒããæ¡åŒµæ©èœãæäŸããŸãã
ãã¹ãç°å¢ã®ã»ããã¢ãã
RTLãå§ããã«ã¯ããã¹ãç°å¢ãã»ããã¢ããããå¿ èŠããããŸããCRAïŒCreate React AppïŒã䜿çšããåºæ¬çãªã»ããã¢ãããæ¬¡ã«ç€ºããŸããCRAã«ã¯ãJestãšRTLãããªã³ã³ãã£ã®ã¥ã¢ãããŠããŸãã
npx create-react-app my-react-app
cd my-react-app
npm install --save-dev @testing-library/react @testing-library/jest-dom
説æ:
- `npx create-react-app my-react-app`: Create React Appã䜿çšããŠæ°ããReactãããžã§ã¯ããäœæããŸãã
- `cd my-react-app`: æ°ããäœæããããããžã§ã¯ããã£ã¬ã¯ããªã«ç§»åããŸãã
- `npm install --save-dev @testing-library/react @testing-library/jest-dom`: å¿ èŠãªRTLããã±ãŒãžãéçºäŸåé¢ä¿ãšããŠã€ã³ã¹ããŒã«ããŸãã `@testing-library/react`ã¯RTLã®ã³ã¢æ©èœãæäŸãã`@testing-library/jest-dom`ã¯DOMãæäœããããã®äŸ¿å©ãªJestãããã£ãŒãæäŸããŸãã
CRAã䜿çšããŠããªãå Žåã¯ãJestãšRTLãåå¥ã«ã€ã³ã¹ããŒã«ããRTLã䜿çšããããã«Jestãæ§æããå¿ èŠããããŸãã
React Testing Libraryã䜿çšããã³ã³ããŒãã³ããã¹ãã®ãã¹ããã©ã¯ãã£ã¹
1. ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã«äŒŒããã¹ããäœæãã
RTLã®åºæ¬ååã¯ãã³ã³ããŒãã³ãããŠãŒã¶ãŒãšåãããã«ãã¹ãããããšã§ããããã¯ãå éšå®è£ ã®è©³çްã§ã¯ãªãããŠãŒã¶ãŒãèŠãŠè¡ãããšã«çŠç¹ãåœãŠãããšãæå³ããŸããRTLãæäŸãã`screen`ãªããžã§ã¯ãã䜿çšããŠãããã¹ããããŒã«ããŸãã¯ã¢ã¯ã»ã·ããªãã£ã©ãã«ã«åºã¥ããŠèŠçŽ ãã¯ãšãªããŸãã
äŸ: ãã¿ã³ã¯ãªãã¯ã®ãã¹ã
ç°¡åãªãã¿ã³ã³ã³ããŒãã³ãããããšããŸãã
// Button.js
import React from 'react';
function Button({ onClick, children }) {
return ;
}
export default Button;
RTLã䜿çšããŠãã¹ãããæ¹æ³ã次ã«ç€ºããŸãã
// Button.test.js
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import Button from './Button';
describe('Button Component', () => {
it('calls the onClick handler when clicked', () => {
const handleClick = jest.fn();
render();
const buttonElement = screen.getByText('Click Me');
fireEvent.click(buttonElement);
expect(handleClick).toHaveBeenCalledTimes(1);
});
});
説æ:
- `render()`: ã¢ãã¯ã®`onClick`ãã³ãã©ãŒã䜿çšããŠButtonã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããŸãã
- `screen.getByText('Click Me')`: ãClick Meããšããããã¹ããå«ãèŠçŽ ã®ããã¥ã¡ã³ããã¯ãšãªããŸããããã¯ããŠãŒã¶ãŒããã¿ã³ãèå¥ããæ¹æ³ã§ãã
- `fireEvent.click(buttonElement)`: ãã¿ã³èŠçŽ ã§ã¯ãªãã¯ã€ãã³ããã·ãã¥ã¬ãŒãããŸãã
- `expect(handleClick).toHaveBeenCalledTimes(1)`: `onClick`ãã³ãã©ãŒã1ååŒã³åºãããããšãã¢ãµãŒãããŸãã
ãããå®è£ ã®è©³çްããã¹ããããããåªããŠããçç±: å¥ã®ã€ãã³ããã³ãã©ãŒã䜿çšããããå éšç¶æ ã倿Žãããããããã«Buttonã³ã³ããŒãã³ãããªãã¡ã¯ã¿ãªã³ã°ããããšãæ³åããŠãã ãããç¹å®ã®ã€ãã³ããã³ãã©ãŒé¢æ°ããã¹ãããŠããå Žåããã¹ãã¯å€±æããŸãããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ïŒãã¿ã³ã®ã¯ãªãã¯ïŒã«çŠç¹ãåœãŠãããšã§ããã¹ãã¯ãªãã¡ã¯ã¿ãªã³ã°åŸãæå¹ãªãŸãŸã§ãã
2. ãŠãŒã¶ãŒã®æå³ã«åºã¥ããŠã¯ãšãªãåªå ãã
RTLã¯ãèŠçŽ ãèŠã€ããããã®ããŸããŸãªã¯ãšãªã¡ãœãããæäŸããŸãããŠãŒã¶ãŒãã³ã³ããŒãã³ããèªèããã³æäœããæ¹æ³ãæãããåæ ããŠãããããæ¬¡ã®ã¯ãšãªããã®é åºã§åªå ããŸãã- getByRole: ãã®ã¯ãšãªã¯æãã¢ã¯ã»ã¹ãããããæåã«éžæããå¿ èŠããããŸããããã«ãããARIAããŒã«ïŒãã¿ã³ããªã³ã¯ãèŠåºããªã©ïŒã«åºã¥ããŠèŠçŽ ãèŠã€ããããšãã§ããŸãã
- getByLabelText: ããã䜿çšããŠãå ¥åãã£ãŒã«ããªã©ãç¹å®ã®ã©ãã«ã«é¢é£ä»ããããèŠçŽ ãèŠã€ããŸãã
- getByPlaceholderText: ããã䜿çšããŠããã¬ãŒã¹ãã«ããŒããã¹ãã«åºã¥ããŠå ¥åãã£ãŒã«ããèŠã€ããŸãã
- getByText: ããã䜿çšããŠãããã¹ãã³ã³ãã³ãã«åºã¥ããŠèŠçŽ ãèŠã€ããŸããå ·äœçã§ãè€æ°ã®å Žæã«è¡šç€ºãããå¯èœæ§ã®ããäžè¬çãªããã¹ãã®äœ¿çšã¯é¿ããŠãã ããã
- getByDisplayValue: ããã䜿çšããŠãçŸåšã®å€ã«åºã¥ããŠå ¥åãã£ãŒã«ããèŠã€ããŸãã
äŸ: ãã©ãŒã å ¥åã®ãã¹ã
// Input.js
import React from 'react';
function Input({ label, placeholder, value, onChange }) {
return (
);
}
export default Input;
æšå¥šãããã¯ãšãªã®é åºã䜿çšããŠãã¹ãããæ¹æ³ã次ã«ç€ºããŸãã
// Input.test.js
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import Input from './Input';
describe('Input Component', () => {
it('updates the value when the user types', () => {
const handleChange = jest.fn();
render();
const inputElement = screen.getByLabelText('Name');
fireEvent.change(inputElement, { target: { value: 'John Doe' } });
expect(handleChange).toHaveBeenCalledTimes(1);
expect(handleChange).toHaveBeenCalledWith(expect.objectContaining({ target: { value: 'John Doe' } }));
});
});
説æ:
- `screen.getByLabelText('Name')`: `getByLabelText`ã䜿çšããŠããNameããšããã©ãã«ã«é¢é£ä»ããããå ¥åãã£ãŒã«ããèŠã€ããŸããããã¯ãå ¥åãèŠã€ããããã®æãã¢ã¯ã»ã¹ããããããŠãŒã¶ãŒãã¬ã³ããªãŒãªæ¹æ³ã§ãã
3. å®è£ ã®è©³çްã®ãã¹ããé¿ãã
åè¿°ã®ããã«ãå éšç¶æ ã颿°åŒã³åºãããŸãã¯ç¹å®ã®CSSã¯ã©ã¹ã®ãã¹ãã¯é¿ããŠãã ããããããã¯å€æŽãããå¯èœæ§ã®ããå®è£ ã®è©³çްã§ãããèããã¹ãã«ã€ãªããå¯èœæ§ããããŸããã³ã³ããŒãã³ãã®èгå¯å¯èœãªåäœã«çŠç¹ãåœãŠãŸãã
äŸ: ç¶æ ãçŽæ¥ãã¹ãããããšãé¿ãã
ç¹å®ã®ç¶æ 倿°ãæŽæ°ããããã©ããããã¹ããã代ããã«ãã³ã³ããŒãã³ãããã®ç¶æ ã«åºã¥ããŠæ£ããåºåãã¬ã³ããªã³ã°ãããã©ããããã¹ãããŸããããšãã°ãã³ã³ããŒãã³ããããŒã«ç¶æ 倿°ã«åºã¥ããŠã¡ãã»ãŒãžã衚瀺ããå Žåãç¶æ 倿°èªäœããã¹ãããã®ã§ã¯ãªããã¡ãã»ãŒãžã衚瀺ãŸãã¯é衚瀺ã«ãªã£ãŠãããã©ããããã¹ãããŸãã
4. ç¹å®ã®ã±ãŒã¹ã«ã¯`data-testid`ã䜿çšãã
äžè¬çã«`data-testid`屿§ã®äœ¿çšã¯é¿ããã®ãæåã§ããã圹ç«ã€ç¹å®ã®ã±ãŒã¹ããããŸãã
- ã»ãã³ãã£ãã¯ãªæå³ãæããªãèŠçŽ : æå³ã®ããããŒã«ãã©ãã«ããŸãã¯ããã¹ããæããªãèŠçŽ ãã¿ãŒã²ããã«ããå¿ èŠãããå Žåã¯ã`data-testid`ã䜿çšã§ããŸãã
- è€éãªã³ã³ããŒãã³ãæ§é : è€éãªã³ã³ããŒãã³ãæ§é ã§ã¯ã`data-testid`ã䜿çšãããšãè匱ãªã»ã¬ã¯ã¿ãŒã«äŸåããã«ç¹å®ã®èŠçŽ ãã¿ãŒã²ããã«ã§ããŸãã
- ã¢ã¯ã»ã·ããªãã£ãã¹ã: `data-testid`ã¯ãCypressãPlaywrightãªã©ã®ããŒã«ã䜿çšããã¢ã¯ã»ã·ããªãã£ãã¹ãäžã«ç¹å®ã®èŠçŽ ãèå¥ããããã«äœ¿çšã§ããŸãã
äŸ: `data-testid`ã®äœ¿çš
// MyComponent.js
import React from 'react';
function MyComponent() {
return (
This is my component.
);
}
export default MyComponent;
// MyComponent.test.js
import React from 'react';
import { render, screen } from '@testing-library/react';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('renders the component container', () => {
render( );
const containerElement = screen.getByTestId('my-component-container');
expect(containerElement).toBeInTheDocument();
});
});
éèŠ: ä»ã®ã¯ãšãªã¡ãœãããé©åã§ãªãå Žåã«ã®ã¿ã`data-testid`ãæ§ããã«äœ¿çšããŠãã ããã
5. æå³ã®ãããã¹ãã®èª¬æãäœæãã
æç¢ºã§ç°¡æœãªãã¹ãã®èª¬æã¯ãåãã¹ãã®ç®çãçè§£ããé害ããããã°ããããã«éèŠã§ãããã¹ããæ€èšŒããŠããå 容ãæç¢ºã«èª¬æãã説æçãªååã䜿çšããŸãã
äŸ: è¯ããã¹ãã®èª¬æãšæªããã¹ãã®èª¬æ
æªãäŸ: `it('åäœãã')`
è¯ãäŸ: `it('æ£ãããããã€ã¡ãã»ãŒãžã衚瀺ãã')`
ããã«è¯ãäŸ: `it('nameããããã£ãæå®ãããŠããªãå ŽåããHello, World!ããšãããããã€ã¡ãã»ãŒãžã衚瀺ãã')`
ããè¯ãäŸã§ã¯ãç¹å®ã®æ¡ä»¶äžã§ã®ã³ã³ããŒãã³ãã®æåŸ ãããåäœãæç¢ºã«ç€ºããŠããŸãã
6. ãã¹ããå°ãããçŠç¹ãçµã
åãã¹ãã¯ãã³ã³ããŒãã³ãã®åäœã®1ã€ã®åŽé¢ãæ€èšŒããããšã«çŠç¹ãåœãŠãå¿ èŠããããŸããè€æ°ã®ã·ããªãªãã«ããŒããå€§èŠæš¡ã§è€éãªãã¹ãã®äœæã¯é¿ããŠãã ãããå°ãããçŠç¹ãçµã£ããã¹ãã¯ãçè§£ãä¿å®ãããã³ãããã°ã容æã§ãã
7. ãã¹ãããã«ïŒã¢ãã¯ãšã¹ãã€ïŒãé©åã«äœ¿çšãã
ãã¹ãããã«ã¯ããã¹ãããŠããã³ã³ããŒãã³ãããã®äŸåé¢ä¿ããåé¢ããã®ã«åœ¹ç«ã¡ãŸããã¢ãã¯ãšã¹ãã€ã䜿çšããŠãå€éšãµãŒãã¹ãAPIåŒã³åºãããŸãã¯ãã®ä»ã®ã³ã³ããŒãã³ããã·ãã¥ã¬ãŒãããŸãã
äŸ: APIåŒã³åºãã®ã¢ãã¯
// UserList.js
import React, { useState, useEffect } from 'react';
function UserList() {
const [users, setUsers] = useState([]);
useEffect(() => {
async function fetchUsers() {
const response = await fetch('/api/users');
const data = await response.json();
setUsers(data);
}
fetchUsers();
}, []);
return (
{users.map(user => (
- {user.name}
))}
);
}
export default UserList;
// UserList.test.js
import React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import UserList from './UserList';
global.fetch = jest.fn(() =>
Promise.resolve({
json: () => Promise.resolve([
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Smith' },
]),
})
);
describe('UserList Component', () => {
it('fetches and displays a list of users', async () => {
render( );
// Wait for the data to load
await waitFor(() => screen.getByText('John Doe'));
expect(screen.getByText('John Doe')).toBeInTheDocument();
expect(screen.getByText('Jane Smith')).toBeInTheDocument();
});
});
説æ:
- `global.fetch = jest.fn(...)`: `fetch`颿°ãã¢ãã¯ããŠãäºåå®çŸ©ããããŠãŒã¶ãŒã®ãªã¹ããè¿ããŸããããã«ãããå®éã®APIãšã³ããã€ã³ãã«äŸåããã«ã³ã³ããŒãã³ãããã¹ãã§ããŸãã
- `await waitFor(() => screen.getByText('John Doe'))`: ãJohn Doeããšããããã¹ããããã¥ã¡ã³ãã«è¡šç€ºãããã®ãåŸ ã¡ãŸããããã¯ãããŒã¿ãéåæçã«ãã§ããããããããå¿ èŠã§ãã
8. ãšããžã±ãŒã¹ãšãšã©ãŒåŠçããã¹ããã
ããããŒãã¹ã ãããã¹ãããªãã§ãã ããããšããžã±ãŒã¹ããšã©ãŒã·ããªãªãããã³å¢çæ¡ä»¶ãå¿ ããã¹ãããŠãã ãããããã¯ãæœåšçãªåé¡ãæ©æã«ç¹å®ããã³ã³ããŒãã³ããäºæããªãç¶æ³ãé©åã«åŠçããããšãä¿èšŒããã®ã«åœ¹ç«ã¡ãŸãã
äŸ: ãšã©ãŒåŠçã®ãã¹ã
APIããããŒã¿ããã§ããããAPIåŒã³åºãã倱æããå Žåã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããã³ã³ããŒãã³ããæ³åããŠãã ãããAPIåŒã³åºãã倱æããå Žåã«ãšã©ãŒã¡ãã»ãŒãžãæ£ãã衚瀺ãããããšãæ€èšŒããããã®ãã¹ããäœæããå¿ èŠããããŸãã
9. ã¢ã¯ã»ã·ããªãã£ã«çŠç¹ãåœãŠã
ã¢ã¯ã»ã·ããªãã£ã¯ãå æ¬çãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãäœæããããã«éèŠã§ããRTLã䜿çšããŠã³ã³ããŒãã³ãã®ã¢ã¯ã»ã·ããªãã£ããã¹ãããWCAGãªã©ã®ã¢ã¯ã»ã·ããªãã£æšæºãæºãããŠããããšã確èªããŸããäž»ãªã¢ã¯ã»ã·ããªãã£ã®èæ ®äºé ãããã€ã瀺ããŸãã
- ã»ãã³ãã£ãã¯HTML: ã»ãã³ãã£ãã¯HTMLèŠçŽ ïŒ`
- ARIA屿§: ç¹ã«ã«ã¹ã¿ã ã³ã³ããŒãã³ãã®å ŽåãARIA屿§ã䜿çšããŠãèŠçŽ ã®ããŒã«ãç¶æ ãããã³ããããã£ã«é¢ããè¿œå æ å ±ãæäŸããŸãã
- ããŒããŒãããã²ãŒã·ã§ã³: ãã¹ãŠã®ã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ãããŒããŒãããã²ãŒã·ã§ã³ã§ã¢ã¯ã»ã¹ã§ããããšã確èªããŸãã
- è²ã®ã³ã³ãã©ã¹ã: èŠèŠé害ã®ãããŠãŒã¶ãŒãããã¹ããèªã¿ãããããããã«ãååãªè²ã®ã³ã³ãã©ã¹ãã䜿çšããŸãã
- ã¹ã¯ãªãŒã³ãªãŒããŒã®äºææ§: ã¹ã¯ãªãŒã³ãªãŒããŒã§ã³ã³ããŒãã³ãããã¹ãããŠãèŠèŠé害ã®ãããŠãŒã¶ãŒã«æå³ã®ããçè§£ãããããšã¯ã¹ããªãšã³ã¹ãæäŸããŠããããšã確èªããŸãã
äŸ: `getByRole`ã䜿çšããã¢ã¯ã»ã·ããªãã£ã®ãã¹ã
// MyAccessibleComponent.js
import React from 'react';
function MyAccessibleComponent() {
return (
);
}
export default MyAccessibleComponent;
// MyAccessibleComponent.test.js
import React from 'react';
import { render, screen } from '@testing-library/react';
import MyAccessibleComponent from './MyAccessibleComponent';
describe('MyAccessibleComponent', () => {
it('renders an accessible button with the correct aria-label', () => {
render( );
const buttonElement = screen.getByRole('button', { name: 'Close' });
expect(buttonElement).toBeInTheDocument();
});
});
説æ:
- `screen.getByRole('button', { name: 'Close' })`: `getByRole`ã䜿çšããŠãã¢ã¯ã»ã¹å¯èœãªååããCloseãã®ãã¿ã³èŠçŽ ãèŠã€ããŸããããã«ããããã¿ã³ãã¹ã¯ãªãŒã³ãªãŒããŒçšã«é©åã«ã©ãã«ä»ããããŠããããšã確èªããŸãã
10. ãã¹ããéçºã¯ãŒã¯ãããŒã«çµ±åãã
ãã¹ãã¯ãåŸåãã«ããã®ã§ã¯ãªããéçºã¯ãŒã¯ãããŒã®äžå¯æ¬ ãªéšåã§ããå¿ èŠããããŸããã³ãŒããã³ããããŸãã¯ãããã€ããããã³ã«ãã¹ããèªåçã«å®è¡ãããããã«ããã¹ããCI/CDãã€ãã©ã€ã³ã«çµ±åããŸããããã¯ããã°ãæ©æã«ãã£ãããããªã°ã¬ãã·ã§ã³ãé²ãã®ã«åœ¹ç«ã¡ãŸãã
11. ããŒã«ãªãŒãŒã·ã§ã³ãšåœéåïŒi18nïŒãæ€èšãã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®å Žåããã¹ãäžã«ããŒã«ãªãŒãŒã·ã§ã³ãšåœéåïŒi18nïŒãæ€èšããããšãéèŠã§ããã³ã³ããŒãã³ããç°ãªãèšèªãšãã±ãŒã«ã§æ£ããã¬ã³ããªã³ã°ãããããšã確èªããŸãã
äŸ: ããŒã«ãªãŒãŒã·ã§ã³ã®ãã¹ã
ããŒã«ãªãŒãŒã·ã§ã³ã«`react-intl`ã`i18next`ãªã©ã®ã©ã€ãã©ãªã䜿çšããŠããå Žåã¯ããã¹ãã§ããŒã«ãªãŒãŒã·ã§ã³ã³ã³ããã¹ããã¢ãã¯ããŠãã³ã³ããŒãã³ããæ£ãã翻蚳ãããããã¹ãã衚瀺ããŠããããšã確èªã§ããŸãã
12. åå©çšå¯èœãªã»ããã¢ããã®ããã®ã«ã¹ã¿ã ã¬ã³ããªã³ã°é¢æ°ã䜿çšãã
å€§èŠæš¡ãªãããžã§ã¯ãã«åãçµãã§ããå Žåãè€æ°ã®ãã¹ãã§åãã»ããã¢ããæé ãç¹°ãè¿ããŠããããšã«æ°ä»ããããããŸãããéè€ãé¿ããããã«ãå ±éã®ã»ããã¢ããããžãã¯ãã«ãã»ã«åããã«ã¹ã¿ã ã¬ã³ããªã³ã°é¢æ°ãäœæããŸãã
äŸ: ã«ã¹ã¿ã ã¬ã³ããªã³ã°é¢æ°
// test-utils.js
import React from 'react';
import { render } from '@testing-library/react';
import { ThemeProvider } from 'styled-components';
import theme from './theme';
const AllTheProviders = ({ children }) => {
return (
{children}
);
}
const customRender = (ui, options) =>
render(ui, { wrapper: AllTheProviders, ...options })
// re-export everything
export * from '@testing-library/react'
// override render method
export { customRender as render }
// MyComponent.test.js
import React from 'react';
import { render, screen } from './test-utils'; // Import the custom render
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('renders correctly with the theme', () => {
render( );
// Your test logic here
});
});
ãã®äŸã§ã¯ãThemeProviderã§ã³ã³ããŒãã³ããã©ããããã«ã¹ã¿ã ã¬ã³ããªã³ã°é¢æ°ãäœæããŸããããã«ããããã¹ãŠã®ãã¹ãã§ThemeProviderã®ã»ããã¢ãããç¹°ãè¿ãããšãªããããŒãã«äŸåããã³ã³ããŒãã³ããç°¡åã«ãã¹ãã§ããŸãã
çµè«
React Testing Libraryã¯ãã³ã³ããŒãã³ããã¹ãã«å¯Ÿãã匷åã§ãŠãŒã¶ãŒäžå¿ã®ã¢ãããŒããæäŸããŸãããããã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ããŠãŒã¶ãŒã®è¡åãšã¢ã¯ã»ã·ããªãã£ã«çŠç¹ãåœãŠããä¿å®ãããã广çãªãã¹ããäœæã§ããŸããããã«ãããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®ãããå ç¢ã§ä¿¡é Œæ§ãé«ããå æ¬çãªReactã¢ããªã±ãŒã·ã§ã³ãå®çŸããŸãããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãåªå ããå®è£ ã®è©³çްã®ãã¹ããé¿ããã¢ã¯ã»ã·ããªãã£ã«çŠç¹ãåœãŠããã¹ããéçºã¯ãŒã¯ãããŒã«çµ±åããããšãå¿ããªãã§ãã ããããããã®ååãæ¡çšããããšã§ãäžçäžã®ãŠãŒã¶ãŒã®ããŒãºãæºããé«å質ã®Reactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãã
äž»ãªãã€ã³ã:
- ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã«çŠç¹ãåœãŠã: ãŠãŒã¶ãŒãæäœããã®ãšåãããã«ã³ã³ããŒãã³ãããã¹ãããŸãã
- ã¢ã¯ã»ã·ããªãã£ãåªå ãã: ã³ã³ããŒãã³ããé害ã®ãããŠãŒã¶ãŒã«ãšã£ãŠã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŸãã
- å®è£ ã®è©³çްãé¿ãã: å éšç¶æ ãŸãã¯é¢æ°åŒã³åºãããã¹ãããªãã§ãã ããã
- æç¢ºã§ç°¡æœãªãã¹ããäœæãã: ãã¹ããçè§£ãããããä¿å®ããããããŸãã
- ãã¹ããã¯ãŒã¯ãããŒã«çµ±åãã: ãã¹ããèªååãã宿çã«å®è¡ããŸãã
- ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ãæ€èšãã: ã³ã³ããŒãã³ããç°ãªãèšèªãšãã±ãŒã«ã§é©åã«åäœããããšã確èªããŸãã