Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Jest global Setup and Teardown in a nodeJS project?

I added tests to my node js project using jest but for each test suite there's a beforeAll method that creates a new test server and connects to a mongo database and an afterAll method that closes both test server and the database. I would like to perform the above tasks globally for all the test suites not one at a time. Below is a sample of my code.

app.js

const express = require("express");
const app = express();
const { connectToDb } = require("./startup/db");
require("./startup/routes")(app);
connectToDb();
...

const port = process.env.PORT || 3000;

if (process.env.NODE_ENV !== "test") {
  app.listen(port, () => winston.info(`Listening on port ${port}...`));
}

module.exports = app;

auth.test.js

const request = require("supertest");
const http = require("http");
const { disconnectDb } = require("../../startup/db");

describe("auth middleware", () => {
  let server;

  beforeAll((done) => {
    const app = require("../../app");
    server = http.createServer(app);
    server.listen(done);
  });

  afterAll((done) => {
    server.close(done);
    disconnectDb();
  });

  it("should return 401 if no token is provided", async () => {
    const res = request(server)
      .post("/api/genres")
      .set("x-auth-token", "")
      .send({ name: "genre1" });
    expect(res.status).toBe(401);
  });

...

jest.config.js

module.exports = {
  testEnvironment: "node",
};
like image 249
Emz Avatar asked Jul 28 '20 15:07

Emz


People also ask

How do I run a Jest test in node JS?

In order to run a specific test, you'll need to use the jest command. npm test will not work. To access jest directly on the command line, install it via npm i -g jest-cli or yarn global add jest-cli . Then simply run your specific test with jest bar.

Where do I put Jest configuration?

According to documentation, you can use config. testPathDirs : https://facebook.github.io/jest/docs/api.html#config-testpathdirs-array-string and you can call jest --config=<config-file> . Unfortunately the documentation doesn't include any description of how the configuration file should look like.

What is setUp and tearDown?

setUp() — This method is called before the invocation of each test method in the given class. tearDown() — This method is called after the invocation of each test method in given class.

What is the purpose of jest setup and teardown?

It may help to illustrate the order of execution of all hooks. Jest executes all describe handlers in a test file before it executes any of the actual tests. This is another reason to do setup and teardown inside before* and after* handlers rather than inside the describe blocks.

Why Jest is failing when globalsetup and globalteardown run?

The typescript environment is not yet defined when globalSetup and globalTeardown are run, which is why jest is failing. A workaround is to create the environment manually by requiring ts-node in those files. require ('ts-node/register'); const setup = (): void => { // whatever you need to set up globally }; export default setup;

Why do we use jest hooks?

Often while writing tests you have some setup work that needs to happen before tests run, and you have some finishing work that needs to happen after tests run. Jest provides helper functions to handle this. If you have some work you need to do repeatedly for many tests, you can use beforeEach and afterEach hooks.

What is the default order of jest tests?

Once the describe blocks are complete, by default Jest runs all the tests serially in the order they were encountered in the collection phase, waiting for each to finish and be tidied up before moving on. Just like the describe and test blocks Jest calls the before* and after* hooks in the order of declaration.


Video Answer


1 Answers

Try with this jest.config.js:

module.exports = {
  testEnvironment: "node",
  globalSetup: '<rootDir>/src/testSetup.ts'
};

And in testSetup.ts you can do:

// testSetup.ts
module.exports = async () => {
    const app = require("../../app");
    server = http.createServer(app);
    server.listen(done);
};
like image 94
Alecu Marian Alexandru Avatar answered Nov 14 '22 22:11

Alecu Marian Alexandru