笑话单元测试失败,并显示NPM软件包模块中的“ ReferenceError”

时间:2019-02-15 16:44:55

标签: javascript node.js unit-testing npm jestjs

安装NPM软件包(我自己的软件包之一)后,我的测试失败。

特别是,我得到ReferenceError: cc is not defined,堆栈跟踪返回到我的NPM软件包中的导出文件之一。

cc是游戏框架(Cocos2d-x)中的一个对象,该对象包含在我的本地项目中。

游戏框架未包含在我的NPM软件包中,但该软件包确实引用了该对象,并假定已安装软件包的任何项目也将包含游戏框架。因此,从本质上讲,Cocos2d-x是一个对等依赖项,但由于它本身不是NPM软件包,因此未列为一个。

我在我的项目中测试的代码未引用游戏框架。而且我从NPM软件包中导入的方法未对游戏框架进行任何引用。我正在使用解构方法(例如import { helper1 } from 'my-package')导入这些方法。

话虽如此,我不希望这是一个问题。但是Jest不喜欢在我的NPM软件包中从完全不同的导出引用cc的事实(一个 not 导入到正在测试的文件中)。换句话说,helper2导致Jest失败,因为它确实引用了cc,但是没有导入helper2

我应该如何解决此错误,以便测试通过?

3 个答案:

答案 0 :(得分:2)

我试图重新创建一个与您的环境相似的环境,但是我无法重现此错误:


/so
  foo/
    index.js
    package.json
  answer.test.js
  package.json

这是./package.json的内容: (如您所见,它具有foo作为依赖项)

{
  "name": "so",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "test": "jest"
  },
  "devDependencies": {
    "jest": "^24.1.0"
  },
  "dependencies": {
    "foo": "./foo"
  }
}

这是./foo/package.json的内容:

{
  "name": "foo",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}

这是./foo/index.js(如您所见helper2引用了一个未定义的全局变量。)

module.exports = {
  helper1: () => 42,
  helper2: () => cc
};

现在测试文件:

const {helper1} = require('foo');

test('helper1 returns the answer', () => {
  expect(helper1()).toBe(42);
});

当我运行测试(yarn test)时,测试通过且没有错误或警告。因此,通过使用引用不在范围内的全局对象的方法似乎不会打扰Jest。

也许您可以利用Jest配置选项:

  1. globals
      

    一组在所有测试环境中都必须可用的全局变量。

  2. setupFiles
      

    运行一些代码以配置或设置测试环境的模块的路径列表。每个setupFile将对每个测试文件运行一次。由于每个测试都在自己的环境中运行,因此这些脚本将在执行测试代码本身之前立即在测试环境中执行。

答案 1 :(得分:0)

在我的特定情况下,问题出在我从NPM软件包中导出的内容之一,如下所示:

// NOTE: cc is undefined, with assumption that any project installing the NPM package will have
// the required game framework
class BackgroundLayer extends cc.Node {}
export default BackgroundLayer;

解决方案是将全局变量简单地添加到项目的Jest配置中,如下所示:

"jest": {
  "globals": {
    "cc": {
      "Node": null
    }
  }
}

在这一点上,我仍然不清楚的是这是否是可以预期的。换句话说,如果Jest应该在与未导入的导出无关的单元测试中失败。

答案 2 :(得分:-2)

您尝试创建精简版吗?

Lite version

cocos2d论坛中对此进行了讨论