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)
我在这里错过了什么?
由于您打开了数据库连接,因此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)
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |