Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot log after tests are done in jestjs

I have written test cases for signin API using jest. After completing all five test of a test suit jest give me following error in log.

Can any body tell Why it is So and how to fix it?

CODE:(signup.test.ts)

import request from 'supertest';
import { TYPES } from '../src/inversify.types'
import { Application } from '../src/app/Application'
import { container } from '../src/inversify.config'
import dotenv from 'dotenv'
import { RESPONSE_CODE } from '../src/utils/enums/ResponseCode'
import { RESPONSE_MESSAGES } from '../src/utils/enums/ResponseMessages'
import { UserSchema } from '../src/components/user/User';
// import jwt from 'jsonwebtoken';
var application: Application

describe("POST / - SIGNUP endpoint", () => {
    // var testusers: any;
    //This hook is executed before running all test cases, It will make application instance, make it to listen 
    // on it on port 3000 and add test document in DB
    beforeAll(async () => {
        // Make enviroment variables available throughout the application
        dotenv.config();
        // Getting application instance using iversify container
        application = container.get<Application>(TYPES.Application);
        // Initialize frontside of application
        await application.bootstrap();
        // Starting Application server on given port
        await application.listen(3000);
    });

    afterAll(
        //This hook is executed after running all test cases and delete test document in database
        async () =>{
        const res = await UserSchema.deleteMany({ Name: { $in: [ "Test User", "Test" ] } });
        // `0` if no docs matched the filter, number of docs deleted otherwise
        console.log('---------------------->>>>>>>>>>>>>>>>>>>', (res as any).deletedCount);
    }
    )

    it("Signup for user that don\'t exists", async () => {
        const response = await request(application.getServer()).post('/user/signup')
        .send({
            "Email": JSON.parse(process.env.TEST_USER).Email,
            "Name": "Test User",
            "Password": process.env.TEST_ACCOUNTS_PASSWORD
            })
            expect(response.status).toBe(RESPONSE_CODE.CREATED);
            expect(JSON.parse(response.text)).toEqual(expect.objectContaining({ 
                Message: RESPONSE_MESSAGES.ADDED_SUCESSFULLY, 
                Data: expect.objectContaining({
                    Name: 'Test User',
                    Country: '',
                    PhoneNumber: '',
                    // Password: '$2b$10$nIHLW/SA73XLHoIcND27iuODFAArOvpch6FL/eikKT78qbShAl6ry',
                    Dob: '',
                    Role: 'MEMBER',
                    IsEmailVerified: false,
                    IsBlocked: 'ACTIVE',
                    IsTokenSent: false,
                    twoFAStatus: false,
                    // _id: '5c812e2715e0711b98260fee',
                    Email: JSON.parse(process.env.TEST_USER).Email
                })
            })
            );
        console.log('*** Signup for user that don\'t exists *** response', response.text, 'response status', response.status);   
    });
    it("Signup for user that exists", async () => {
        const response = await request(application.getServer()).post('/user/signup')
        .send({
            "Email": JSON.parse(process.env.TEST_USER).Email,
            "Name": "Test User",
            "Password": process.env.TEST_ACCOUNTS_PASSWORD
            })
            expect(response.status).toBe(RESPONSE_CODE.CONFLICT);
            expect(JSON.parse(response.text)).toEqual({ 
                Message: RESPONSE_MESSAGES.ALREADY_EXISTS
            })
        console.log('*** Signup for user that don\'t exists *** response', response.text, 'response status', response.status);   
    });

});

Jest did not exit one second after the test run has completed.

This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with --detectOpenHandles to troubleshoot this issue.

Cannot log after tests are done. Did you forget to wait for something async in your test?

Attempted to log "{ accepted: [ '[email protected]' ],
      rejected: [],
      envelopeTime: 621,
      messageTime: 867,
      messageSize: 906,
      response: '250 2.0.0 OK  1551945300 f6sm5442066wrt.87 - gsmtp',
      envelope:
       { from: '[email protected]',
         to: [ '[email protected]' ] },
      messageId: '<[email protected]>' }".




at CustomConsole.log (node_modules/jest-util/build/CustomConsole.js:156:10)
  at src/email/MailHandler.ts:2599:17
  at transporter.send.args (node_modules/nodemailer/lib/mailer/index.js:226:21)
  at connection.send (node_modules/nodemailer/lib/smtp-transport/index.js:247:32)
  at callback (node_modules/nodemailer/lib/smtp-connection/index.js:435:13)
  at stream._createSendStream (node_modules/nodemailer/lib/smtp-connection/index.js:458:24)
  at SMTPConnection._actionSMTPStream (node_modules/nodemailer/lib/smtp-connection/index.js:1481:20)
  at SMTPConnection._responseActions.push.str (node_modules/nodemailer/lib/smtp-connection/index.js:968:22)
  at SMTPConnection._processResponse (node_modules/nodemailer/lib/smtp-connection/index.js:764:20)
  at SMTPConnection._onData (node_modules/nodemailer/lib/smtp-connection/index.js:570:14)
like image 421
Al Fahad Avatar asked Mar 07 '19 08:03

Al Fahad


4 Answers

I was using the react-native default test case (see below) when Cannot log after tests are done happened.

it('renders correctly', () => {
  renderer.create(<App />);
});

Apparently, the problem was that the test ended but logging was still needed. So I tried to make the callback in the test case async, hoping that the test won't terminate immediately:

it('renders correctly', async () => {
  renderer.create(<App />);
});

And it worked. However, I have very little clue what the inner working is.

like image 71
Fanchen Bao Avatar answered Nov 20 '22 20:11

Fanchen Bao


If you are using async/await type in your code, then this error can occur when you are calling async function without await keyword.

In my case, I have defined a function like this below,

async getStatistics(headers) {
    ....
    ....
    return response;
}

But I have called this method like getStatistics(headers) instead of await getStatistics(headers).

When I included await, it worked fine and the issue resolved.

like image 9
uvaiz Avatar answered Nov 20 '22 18:11

uvaiz


For me I needed to add an await before the expect() call also to stop this error (and an async before the test() callback function).

Also caused and fixed Jest not detecting coverage on the lines in the code throwing the error!

test("expect error to be thrown for incorrect request", async () => {
  await expect(
  // ^ added this
    async () => await getData("i-made-this-up")
  ).rejects.toThrow(
    "[API] Not recognised: i-made-this-up"
  );
});

getData() returns an Axios call and in this case an error is caught by catch and re-thrown.

const getData = async (id) => {
  return await axios
    .get(`https://api.com/some/path?id=${id}`)
    .then((response) => response.data)
    .catch((error) => {
      if (error?.response?.data?.message) {
        console.error(error) // Triggered the error
        throw new Error("[API] " + error.response.data.message);
      }

      throw error;
    });
};
like image 1
s27840 Avatar answered Nov 20 '22 18:11

s27840


This happened to me because I had an infinite loop while (true). In my case, I was able to add a method for setting the value of the loop based on user input, rather than defaulting to true.

like image 1
Janac Meena Avatar answered Nov 20 '22 20:11

Janac Meena