You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS/Mocha单元测试引用外部函数出现ReferenceError问题求助

解决Mocha测试中ReferenceError: main is not defined的问题

嘿,刚接触NodeJS和Mocha踩这种坑太正常啦!我帮你拆解下问题根源,再一步步解决:

问题1:测试文件没引入目标模块

你在test.js里直接用了main,但完全没加载index.js文件,NodeJS根本不知道main是什么,这是触发ReferenceError的直接原因。

问题2:模块导出方式完全错误

再看你的index.js:

async function main() {
  function comparer(otherArray) { /* ... */ }
}
module.exports = main();

这里有两个致命问题:

  1. 你调用了main()并导出它的返回值,但main函数内部没有任何return语句,所以导出的是一个已resolved的Promise,值为undefined。
  2. comparer是main内部的嵌套函数,外部代码根本无法直接访问它——哪怕main被正确导出,你也拿不到comparer。

修复方案

根据你的需求,我给你两种常见的修复方式:

方案一:直接导出comparer(推荐,如果comparer不需要依赖main内部逻辑)

修改index.js,把comparer提到main外面,然后导出需要的函数:

// 把comparer独立出来,方便外部调用
function comparer(otherArray) {
  return function (current) {
    return otherArray.filter(function (other) {
      return other.prm === current.prm && other.conso_prod === current.conso_prod
    }).length === 0;
  }
}

async function main() {
  // 这里保留你的main函数逻辑,如果有的话
}

// 导出需要被测试的函数和main
module.exports = { main, comparer };

然后修改test.js,引入模块并使用comparer,另外注意数组比较要用deep.equal(因为数组是引用类型,===只会比较引用地址,不会对比内容):

const { expect } = require('chai');
// 引入index.js模块(假设test.js和index.js在同一目录)
const { comparer } = require('./index');

describe('Array comparison tests', () => {
  it('should return empty array when comparing two empty arrays', () => {
    const meters = [];
    const perimeter = [];
    const onlyInMeters = meters.filter(comparer(perimeter));
    // 用deep.equal来对比数组内容
    expect(onlyInMeters).to.deep.equal([]);
  });
});

方案二:如果comparer必须在main内部(依赖main的变量)

修改index.js,让main返回包含comparer的对象,同时导出main函数本身:

async function main() {
  function comparer(otherArray) {
    return function (current) {
      return otherArray.filter(function (other) {
        return other.prm === current.prm && other.conso_prod === current.conso_prod
      }).length === 0;
    }
  }

  // 返回包含comparer的对象,让外部能访问
  return { comparer };
}

// 导出main函数,而不是它的调用结果
module.exports = main;

对应的test.js需要异步调用main来获取comparer:

const { expect } = require('chai');
const main = require('./index');

describe('Array comparison tests', () => {
  // 用async包裹测试回调,支持await
  it('should return empty array when comparing two empty arrays', async () => {
    // 调用main获取返回的对象
    const { comparer } = await main();
    const meters = [];
    const perimeter = [];
    const onlyInMeters = meters.filter(comparer(perimeter));
    expect(onlyInMeters).to.deep.equal([]);
  });
});

最后再提醒下

  • 模块导出时,要明确导出的是函数本身还是函数调用结果,这在NodeJS里很容易搞混。
  • 测试数组、对象这类复杂类型时,一定要用deep.equal或者to.eql,否则会因为引用不同导致测试失败。

内容的提问来源于stack exchange,提问作者Juliatzin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:12:37