简介
Chai 是一个流行的 Node.js 测试框架,其使用 assert 库进行断言。然而,当我们使用 new
关键字来创建一个实例时,有时候会遇到 Object is not a constructor
的错误。
问题分析
这个错误的原因是因为我们使用了错误的语法或者引用了一个不是 constructor 的对象。
对于语法错误,我们需要检查传入 new 的参数是否正确。这个参数必须是一个 constructor,也就是一个函数。
对于不是 constructor 的对象,我们需要检查该对象是否本身就不是一个 constructor,或者是否我们在使用 import 或 require 时,引用了一个错误的库。
解决方案
检查传入参数
我们使用 new 关键字时,是要传入一个构造函数,例如:
class Foo {} const foo = new Foo() // 这里的 Foo 就是一个构造函数
而我们如果传入的不是构造函数的话,就会报 Object is not a constructor 的错误:
const foo = new 'Foo'() // TypeError: 'Foo' is not a constructor
我们在调用 chai.assert 的时候,同样需要传入一个构造函数:
chai.assert.instanceOf(foo, Object) // Foo.prototype 必须要继承自 Object.prototype
我们如果传入一个非构造函数,如:
chai.assert.instanceOf(foo, 'Object') // TypeError: "Object" is not a constructor
就会遇到 Object is not a constructor 的错误。所以,我们要保证传递给 instanceOf 的参数必须是一个构造函数。
检查 Library
如果我们的代码没有语法错误,那么我们需要检查我们是否正确引入了必要的库。特别是当我们使用 require 或 import 时,需要确保我们引入的是正确的库。
例如,我们在 Mocha 中使用 chai,我们应该这样引入:
const chai = require('chai')
然后是断言时:
const { assert } = chai
这是正确的用法。但有时候,我们会误写成这样:
const chai = require('chai/chai') // 错误的路径 const { assert } = chai
或者是这样:
import { assert } from 'chai/unsafe/assert' // 错误的方法
这些都会导致 Object is not a constructor 的错误。所以,检查我们的库引用是很重要的。
示例代码
-- -------------------- ---- ------- ----- ---- - --------------- ----- - ------ - - ---- ----- --- -- ----- --- - --- ----- -- --- --------- ---------------------- ---- ---------------------- ------- -- --- --------- ---------------------- ------ -- ---------- ----- -- --- - ----------- ---------------------- --------- -- ---------- -------- -- --- - -----------
总结
Chai assertion 错误:Object is not a constructor,通常是由于我们使用了错误的语法或者引用了不正确的库所导致。我们需要确保我们传递给 instanceOf 的参数是一个构造函数,并且我们正确引用了需要的库。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c88d5c5ad90b6d0413eb90