我调用此函数,调用控制台日志但未调用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)
我在这里缺少什么?
答案 0 :(得分: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
类的实现替换为不执行I / O操作的Database
类。
尽管依赖注入实现可能因需求而异,但也可以使用一些简单的实现:
https://blog.risingstack.com/dependency-injection-in-node-js/
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);
});
});