如何修正Mocha中的TypeError: 'flattenArray' is not a function错误
嘿,我来帮你搞定这个测试失败的问题!你遇到的报错和代码里的小问题其实都挺典型的,咱们一步步拆解解决:
1. 先修复递归调用的函数名拼写错误
看你flattenArray.js里的递归逻辑,你写了result = result.concat(flattenArrays(element));——这里多了个"s"!正确的函数名应该是flattenArray,这个拼写错误会导致递归时调用不存在的函数,虽然当前报错是"flattenArray is not a function",但这个问题也得先修正,不然就算导入成功了测试还是会失败。
修正后的函数代码:
// flattenArray.js export function flattenArray(arr){ let result = []; arr.forEach(function(element) { if(!Array.isArray(element)) { result.push(element); } else { // 把flattenArrays改成flattenArray result = result.concat(flattenArray(element)); } }); return result; }
2. 解决ES模块与CommonJS的导入导出不兼容问题
你的函数用的是ES模块的export语法,但测试文件用的是CommonJS的require,Node.js默认情况下这两种模块系统不能直接混用,所以才会出现"flattenArray is not a function"的报错——本质是你没正确导入到这个函数。
这里有两种解决方式,选一种适合你的就行:
方式一:把测试文件改成ES模块
- 首先在你的项目根目录的
package.json里添加"type": "module",这样Node.js会把所有.js文件当作ES模块处理; - 然后修改测试文件的导入方式:
// flattenArray.spec.js import chai from 'chai'; import { flattenArray } from './flattenArray.js'; const assert = chai.assert; // 示例测试用例 describe('flattenArray', function() { it('should flatten a single-level nested array', function() { assert.deepEqual(flattenArray([1, [2, 3], 4]), [1, 2, 3, 4]); }); it('should flatten deeply nested arrays', function() { assert.deepEqual(flattenArray([1, [2, [3, [4]]]]), [1, 2, 3, 4]); }); });
方式二:把函数文件改成CommonJS导出
如果你不想用ES模块,直接把flattenArray.js改成CommonJS的导出格式:
// flattenArray.js function flattenArray(arr){ let result = []; arr.forEach(function(element) { if(!Array.isArray(element)) { result.push(element); } else { result = result.concat(flattenArray(element)); } }); return result; } module.exports = { flattenArray };
然后测试文件里正常用require导入:
// flattenArray.spec.js var chai = require('chai'); var assert = chai.assert; var { flattenArray } = require('./flattenArray.js'); // 这里写你的测试用例 describe('flattenArray', function() { // 测试逻辑... });
把这两个问题都修复后,再跑Mocha测试应该就能正常通过啦!
内容的提问来源于stack exchange,提问作者Kevin T.
相关产品推荐
相关产品推荐

