安装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
。
我应该如何解决此错误,以便测试通过?
答案 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配置选项:
globals
一组在所有测试环境中都必须可用的全局变量。
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)