DEV Community

Cover image for A guide to testing and formatting in react
RonFrontWeb
RonFrontWeb

Posted on

A guide to testing and formatting in react

A guide to testing and formatting in react

Here is a tutorial that explain how to implement

  • Tests in react
  • Pre-commit hooks for tests
  • Prettier og rules for formatting in react
  • Pre-commit hooks for prettier

Before we begin you need to find a code editor
For this tutorial i am using “visual studio code” but you decide which one you want to use

Start by creating a folder , but remember that the name has to be in lowercase and The folder has to be completely empty or react will not accept it.

Then you can open the terminal and enter the command ( npx create-react-app .)

Now you can run (npm start) to test that react is working
You should be at browser window popoing up with a page and the react logo.

Installing packages

Now we need to install the rest of the npm packages with need for testing and formatting

we are going to be using

  • prettier (formatting)
  • eslint-config-prettier (prettier add on)
  • husky (controls precommits)
  • cross environment (connects scripts across platforms)

Format packages

first we will use the command npm i -D prettier to install prettier and then the add on npm i -D eslint-config-prettier
that turns off all rules that are unnecessary or might conflict with Prettier

and that is our formatting done.

Pre-commit packages

now for the pre-commit packages

we are going to install npx mrm lint-staged and this will install husky and lint-staged packages and update your package.json

after the first one we are going to install using this command npx husky install
this will help us make sure that our code is without errors and prevent that code from being uploaded and give you information to fix the issue so that you can commit working code.

for the last install we are going to write npx husky add .husky/pre-commit "npm test" and this will create a file in the folder .husky called pre-commit and adds the command "npm test"

Installer cross-env

we need to install npm i -D cross-env and short what this does is end our test when is has finished and allows us to commit

after we manually add to our package.json these two commmads to scripts

  • "test": "cross-env CI=true react-scripts test"
  • "prettier": "prettier --write ."

and to the pre-commit file

add - npm run prettier and this runs prettier if the test is succesfull

Setting up a test on a component

Here we see a simple component

function Navbar(props) {
    return (
        <nav>
            <ul>
                <li>
                    <a href="#">Home</a>
                </li>
                <li>
                    <a href="#">About</a>
                </li>
                <li>
                    <a href="#">Store</a>
                </li>
                <li>
                    <a href="#">Contact</a>
                </li>
            </ul>
        </nav>
    );
}

export default Navbar;
Enter fullscreen mode Exit fullscreen mode

now let's see how a test looks
here we are testing to see if the component Navbar.js is rendering "home" in the browser

import { render, screen } from "@testing-library/react";
import Navbar from "./Navbar";

test("check to see if text home is rendered", () => {
    render(<Navbar />);
    const checker = screen.getByText(/Home/i);
    expect(checker).toBeInTheDocument();
});
Enter fullscreen mode Exit fullscreen mode

so when we run npm test we will get

PASS src/Navbar.test.js
  ✓ check to see if text home is rendered (33 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        1.878 s, estimated 2 s
Ran all test suites.
Enter fullscreen mode Exit fullscreen mode

here we see the test is passed

if the code were to fail it would look like this

FAIL src/Navbar.test.js
  ✕ check to see if text home is rendered (34 ms)

  ● check to see if text home is rendered

    TestingLibraryElementError: Unable to find an element with the text: /Homie/i. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.

    <body>
      <div>
        <nav>
          <ul>
            <li>
              <a
                href="#"
              >
                Home
              </a>
            </li>
            <li>
              <a
                href="#"
              >
                About
              </a>
            </li>
            <li>
              <a
                href="#"
              >
                Store
              </a>
            </li>
            <li>
              <a
                href="#"
              >
                Contact
              </a>
            </li>
          </ul>
        </nav>
      </div>
    </body>

       5 | test('check to see if text home is rendered', () => {
       6 |   render(<Navbar />);
    >  7 |   const checker = screen.getByText(/Homie/i);
         |                          ^
       8 |   expect(checker).toBeInTheDocument();
       9 | });
      10 |

      at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:37:19)
      at node_modules/@testing-library/dom/dist/query-helpers.js:90:38
      at node_modules/@testing-library/dom/dist/query-helpers.js:62:17
      at getByText (node_modules/@testing-library/dom/dist/query-helpers.js:111:19)
      at Object.<anonymous> (src/Navbar.test.js:7:26)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        1.952 s, estimated 2 s
Ran all test suites.
npm ERR! Test failed.  See above for more details.
Enter fullscreen mode Exit fullscreen mode

It tells us what kind of error we are dealing with and where to locate it
so we can fix it.

in this example we changed home to homie so the test will fail because it can't find home
and when we correct the error our test will pass.

now lets have a look at prettier and what that does for our code

this example of a code that is hard to read because of poor formatting

function Navbar(props) {
    return (
    <nav>
        <ul>
                <li>
        <a href="#">Home</a>
                </li>
                <li>
    <a href="#">About</a>
            </li>
                <li>
                    <a href="#">Store</a>
        </li>
        <li>
                    <a href="#">Contact</a>
        </li>
        </ul>
        </nav>
    );
}

export default Navbar;
Enter fullscreen mode Exit fullscreen mode

but because we use prettier wich run with our git commit -m "message"
so it will fix our poor formatting for us and make it look like this and we get nice readable code.

function Navbar(props) {
    return (
        <nav>
            <ul>
                <li>
                    <a href="#">Home</a>
                </li>
                <li>
                    <a href="#">About</a>
                </li>
                <li>
                    <a href="#">Store</a>
                </li>
                <li>
                    <a href="#">Contact</a>
                </li>
            </ul>
        </nav>
    );
}

export default Navbar;

Enter fullscreen mode Exit fullscreen mode

but if the test doesn't pass you can't commit and prettier will not run.

Top comments (0)