解决 Mocha 测试时出现 “TypeError: done is not a function” 错误的方法

问题背景

在前端开发中,我们经常使用测试框架 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