【问题标题】:Async Mocha done() isn't called in my function我的函数中没有调用异步 Mocha done()
【发布时间】:2017-11-12 14:06:39
【问题描述】:

我调用了这个函数,调用了控制台日志但是没有调用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()
        })
    })
})

这是结果,“正在运行的测试”会永远继续旋转:

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

setTimeout(function () {
            console.log('lol')
            done()
        }, 1000)

我在这里错过了什么?

【问题讨论】:

  • Database.saveSessionData中的回调函数是否被调用?
  • 一般done()前面有错误。尝试将您的期望包装在 try catch 中,并将 console.log/error 异常。
  • @marcel 它被调用,所以 2222 被打印出来。
  • 根据您提供的图片,您的测试成功通过,在我看来,您的 mocha 测试只是挂起,因为您打开了数据库连接。通常你不想测试真实的数据库连接并使用 mocks/stubs/dependency injection 来为异步实用程序库注入测试行为。
  • 顺便说一句,如果您仍然想创建真正的数据库连接,您可以使用 mocha 库的 after 挂钩 - 它会在您调用类似 @987654328 的所有测试后启动您提供的回调@.

标签: javascript typescript mocha.js webstorm chai


【解决方案1】:

Mocha 测试挂起,因为您打开了数据库连接。

解决这个问题有两种选择:

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

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

  • 考虑在您的 mocha 测试中添加一个 after 挂钩:

假设 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);
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2018-02-23
    相关资源
    最近更新 更多