问题背景
在前端开发中,我们经常使用测试框架 Mocha 来编写单元测试和集成测试。然而,在编写测试代码过程中,我们有时会遇到 TypeError: done is not a function
的错误,例如:
it('should return 200 and an array of todo items', done => { request(app) .get('/api/todo') .expect(200, (err, res) => { if (err) return done(err) expect(res.body).to.be.an('array') done() }) })
该错误提示变量 done
不是一个函数,无法被调用。
解决方法
1. 确认版本兼容性
首先,确认所使用的 Mocha 版本是否与使用方式兼容。不同版本的 Mocha 对 done
函数的使用方式可能存在差异,导致 done
函数无法被正确调用。
例如,在 Mocha 版本 6.x 中,我们应该使用箭头函数(() => {}
)而非 ES5 标准的函数声明来定义测试用例中的回调函数,否则会出现 done is not a function
的错误:
it('should return 200 and an array of todo items', (done) => { request(app) .get('/api/todo') .expect(200, (err, res) => { if (err) return done(err) expect(res.body).to.be.an('array') done() }) })
2. 导入 assert 库
当我们使用 Mocha 进行测试时,我们通常需要使用 node.js 内置的 assert 库来编写测试断言。在这种情况下,我们需要在测试代码最开始处导入 assert 库,并且在测试用例的回调函数中使用 assert 库中的 assert
方法来执行断言。
代码示例:
const assert = require('assert') it('should return 200 and an array of todo items', (done) => { request(app) .get('/api/todo') .expect(200, (err, res) => { if (err) return done(err) assert(Array.isArray(res.body)) done() }) })
3. 确定 done
函数参数
在测试用例的回调函数中,done
函数是 Mocha 传递的一个参数,我们需要确认该参数是否被正确命名。通常情况下,我们应该将其命名为 done
。
如前面的代码示例所示,我们使用 (done) => {}
来定义测试回调函数,其中的 done
就是 Mocha 传递的回调函数参数。
如果我们误将该参数重命名为其他名称,例如 callback
,则 Mocha 将无法正常处理 done
回调函数,从而出现 done is not a function
的错误。
正确示例:
it('should return 200 and an array of todo items', (done) => { request(app) .get('/api/todo') .expect(200, (err, res) => { if (err) return done(err) expect(res.body).to.be.an('array') done() }) })
错误示例:
it('should return 200 and an array of todo items', (callback) => { request(app) .get('/api/todo') .expect(200, (err, res) => { if (err) return callback(err) expect(res.body).to.be.an('array') callback() // 错误!应该调用 done() 方法 }) })
总结
当我们使用 Mocha 编写测试时,出现 done is not a function
错误可能是因为版本兼容性、assert 库导入或者回调函数参数命名等方面的问题。正确的解决方法可以提高我们编写测试代码的效率和质量,也可以加深我们对测试框架以及 JavaScript 的理解。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65af6f73add4f0e0ff8ddfd5