简体   繁体   中英

Typescript + Mocha/Chai - For async tests and hooks, ensure “done()” is called; if returning a Promise, ensure it resolves

I know that kind of problem is old. But I already tried everything, and I can't solve this problem.

The error is

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

I already tried set a large timeout. But this solution does not work too.

Follow my code and the class who access mongo.

import { expect } from 'chai';
import { UserService } from "./../services/userService";

describe('Testar Usuario Service', () => {
  
  describe('Método GET Teste', () => {
    const userService = new UserService();
    const users = userService.getTeste();
    it('Deve retornar uma lista de nomes', () => {
      expect(users).to.be.an('array');
    });
  });

  describe('Method GET All Users', () => { //the error happen here
    
    it('Deve retornar uma lista com todos os Usuários', (done) => {
      const userService = new UserService();
      return userService.getAllUsers().then(result => {
        expect(result).to.be.an('array');
        done();
      }).catch((error) => {
        done(error);
      })
      
    });
  });
  
});
import { UserSchema } from '../models/userModel';
import * as mongoose from 'mongoose';
import {Request, Response} from "express";

const User = mongoose.model('User', UserSchema);

export class UserService {

    public getTeste() {
        const text = [{ "firstName":"John" , "lastName":"Doe" },
        { "firstName":"Anna" , "lastName":"Smith" },
        { "firstName":"Peter" , "lastName":"Jones" }];
        return text;
    }

    public async getAllUsers() {
        try {
            const users = await User.find({});
            return users;
        } catch (err) {
            throw new Error('Erro de conexão');
        }
    }

    public async insertUser(req: Request) {
        const newUser = new User(req.body); 
        try {
            await newUser.save();
        } catch (err) {
            throw new Error('Erro de conexão');
        }
    }

    public async updateUser(req: Request) {
        try {
            const user = await User.findOneAndUpdate(
                {cpf: req.body.cpf},
                req.body,
                { new: true }
            );
            return user;
        } catch (err) {
            throw new Error('Erro de conexão');
        } 
    }

    public async getUser(req: Request) {
        try {
            const user = await User.findOne({cpf: req.params.cpf});
            return user;
        } catch (err) {
            throw new Error('Erro de conexão');
        }
    }

    public async deleteUser(req: Request) {
        try {
            const user = await User.findOneAndDelete({cpf: req.params.cpf});
            return user;
        } catch (err) {
            throw new Error('Erro de conexão');
        }
    }
}

I can share my package.json and tsconfig.json too. If someone could help me, I'll appreciate.

According to the documentation you need to either return a promise, or use the done() callback.

So either remove the return:

describe('Method GET All Users', () => { //the error happen here
  it('Deve retornar uma lista com todos os Usuários', (done) => {
    const userService = new UserService();
    userService.getAllUsers().then(result => {
      expect(result).to.be.an('array');
      done();
    }).catch((error) => {
      done(error);
    })     
  });
});

or use the async/await syntax :

describe('Method GET All Users', () => { //the error happen here
  it('Deve retornar uma lista com todos os Usuários', async () => {
    const userService = new UserService();
    const result = await userService.getAllUsers();
    expect(result).to.be.an('array');
  });
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM