我的函数中未调用 Async Mocha done()
Async Mocha done() isn't called in my function
我调用了这个函数,调用了控制台日志但没有调用 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()
})
})
})
这是结果,'Running tests' 继续旋转下去:
但是如果我将 'Database' 代码改成这样,它会按预期工作:
setTimeout(function () {
console.log('lol')
done()
}, 1000)
我在这里错过了什么?
Mocha 测试挂起,因为您打开了数据库连接。
有两种方案可以解决这个问题:
如果您在测试中不需要真正的数据库连接:
您可以使用 sinon.stub()
(https://www.npmjs.com/package/sinon) 到 return 您在测试中使用的异步方法的预定响应或 sinon.spy()
确定调用了确切次数的存根方法。
这是我刚刚找到的一篇很好的文章来说明如何使用 sinon.js:https://semaphoreci.com/community/tutorials/best-practices-for-spies-stubs-and-mocks-in-sinon-js。
您可以实现一个依赖注入容器,以便能够将您的 Database
class 实现替换为 Database
class执行 I/O 操作。
虽然依赖注入的实现可能会因需求而异,但也可以使用一些简单的实现:
https://blog.risingstack.com/dependency-injection-in-node-js/
如果您需要在测试中执行真实连接:
- 考虑为您的 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);
});
});
我调用了这个函数,调用了控制台日志但没有调用 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()
})
})
})
这是结果,'Running tests' 继续旋转下去:
但是如果我将 'Database' 代码改成这样,它会按预期工作:
setTimeout(function () {
console.log('lol')
done()
}, 1000)
我在这里错过了什么?
Mocha 测试挂起,因为您打开了数据库连接。
有两种方案可以解决这个问题:
如果您在测试中不需要真正的数据库连接:
您可以使用
sinon.stub()
(https://www.npmjs.com/package/sinon) 到 return 您在测试中使用的异步方法的预定响应或sinon.spy()
确定调用了确切次数的存根方法。这是我刚刚找到的一篇很好的文章来说明如何使用 sinon.js:https://semaphoreci.com/community/tutorials/best-practices-for-spies-stubs-and-mocks-in-sinon-js。
您可以实现一个依赖注入容器,以便能够将您的
Database
class 实现替换为Database
class执行 I/O 操作。虽然依赖注入的实现可能会因需求而异,但也可以使用一些简单的实现:
https://blog.risingstack.com/dependency-injection-in-node-js/
如果您需要在测试中执行真实连接:
- 考虑为您的 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);
});
});