在我的函数中没有调用异步Mocha done()

Esq*_*uth 0 javascript mocha.js webstorm chai typescript

我调用此函数,调用控制台日志但未调用done():

import {Database} from "../../code/server/Database";
import 'mocha'
const expect = require('chai').expect

describe('Database save', function() {
    it('should save without error', function(done) {
        Database.saveSessionData(1, 2, 3, function(err, docs) {
            expect(err).to.equal(null)
            expect(docs.sessionOpenTime).to.equal(1)
            expect(docs.sessionCloseTime).to.equal(2)
            expect(docs.sessionLength).to.equal(3)
            console.log(2222)
            done()
        })
    })
})
Run Code Online (Sandbox Code Playgroud)

结果是,"运行测试"将继续持续进行:

结果

但是,如果我将"数据库"代码更改为此代码,它将按预期工作:

setTimeout(function () {
            console.log('lol')
            done()
        }, 1000)
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

Nik*_*kin 5

由于您打开了数据库连接,因此Mocha测试会挂起.

有两种方法可以解决此问题:

如果您的测试中不需要真正的数据库连接:

  • 您可以使用sinon.stub()(https://www.npmjs.com/package/sinon)返回您在测试中使用的异步方法的预定响应,或sinon.spy()确保称为精确次数的存根方法.

    这是一篇很好的文章,我刚刚发现如何使用sinon.js:https://semaphoreci.com/community/tutorials/best-practices-for-spies-stubs-and-mocks-in-sinon-js .

  • 您可以实现依赖注入容器,以便能够将Database类的实现替换为Database不执行I/O操作的类.

    尽管依赖注入实现可能因需求而异,但也可以使用一些简单的实现:

    https://blog.risingstack.com/dependency-injection-in-node-js/

如果您需要在测试中执行真正的连接:

  • 考虑after为你的mocha测试添加一个钩子:

让我们说mongodb用作数据库(没关系,但它将是一个实际的工作示例)

const mongoose = require('mongoose');
const expect = require('chai').expect;

mongoose.connect('mongodb://localhost/test');

after(() => {
  mongoose.connection.close();
});

describe('db connection', () => {
  it('should make a test', () => {
    expect(1).to.equal(1);
  });
});
Run Code Online (Sandbox Code Playgroud)